Инструменты для генерации классов сущностей JPA из таблиц базы данных

Вопрос или проблема

Я использую Hibernate-Tools и JPA tools в Eclipse для генерации классов сущностей JPA из существующей базы данных.

Проблема заключается в том, что этот процесс действительно сложно настроить и в нем много мелких “ошибок”, особенно если вам нужна конкретная схема из базы данных, и, по сути, все шаги нужно выполнять точно, чтобы сгенерировать эти классы, поэтому я исследую другие альтернативы.

Нет ограничений, если это IDE, онлайн-приложения, автономные приложения, просто чтобы они были бесплатными.

Я использовал OpenJPA через скрипт сборки Gradle вот так и был довольно доволен им:

build.gradle.kts

dependencies {
    ...
    val jpa = configurations.create("jpa")
    jpa("org.apache.openjpa:openjpa-all:2.3.0")
    jpa("org.postgresql:postgresql")
}

tasks {
    register<JavaExec>("genSchema") {
        classpath = configurations["jpa"]
        main = "org.apache.openjpa.jdbc.schema.SchemaTool"
        args = mutableListOf(
                "-properties", "config/openjpa.xml",
                "-action", "reflect",
                "-file", "build/schema.xml"
        )
    }

    register<JavaExec>("genEntity") {
        dependsOn("genSchema")
        classpath = configurations["jpa"]
        main = "org.apache.openjpa.jdbc.meta.ReverseMappingTool"
        args = mutableListOf(
                "-properties", "config/openjpa.xml",
                "-metadata", "none",
                "-annotations", "true",
                "-nullableAsObject", "true",
                "-useGenericCollections", "true",
                "-directory", "src/main/java/${project.group}/${project.name}/entity",
                "-pkg", "${project.group}.${project.name}.entity",
                "build/schema.xml"
        )
    }
}

Теперь вы можете просто запустить ./gradlew genEntity в любое время, когда вам нужно сгенерировать классы сущностей.

Некоторые заметки по использованию этого:

  • Здесь я генерирую классы непосредственно в src. Лучшей практикой было бы генерировать их в другом месте и вручную копировать файлы.

  • Это требует наличия файла config/openjpa.xml, чтобы сказать скрипту, какие параметры использовать для подключения к базе данных. Вы можете использовать этот файл как пример: https://gist.github.com/rafaeltuelho/39c98965954859b43733

  • Процесс почти автоматизирован, поэтому как только у вас есть config/openjpa.xml, никаких ручных настроек не требуется.

Ответ или решение

Инструменты для генерации классов сущностей JPA из таблиц базы данных

Генерация классов сущностей JPA из существующей базы данных может быть сложной задачей, особенно если требуется специфическая схема. Ваша текущая настройка с использованием Hibernate-Tools и JPA Tools в среде Eclipse предоставляет вам определенные функции, но, как вы отметили, процесс может быть сложен и подвержен ошибкам. В этой статье мы рассмотрим более простые и эффективные альтернативы для генерации JPA сущностей.

1. Использование OpenJPA через Gradle

Вы упомянули, что вы уже работаете с OpenJPA и используете скрипт Gradle, что является отличным выбором. OpenJPA предлагает инструменты, которые позволяют легко генерировать классы сущностей из базы данных. Вот как организовано это в вашем build.gradle.kts:

dependencies {
    ...
    val jpa = configurations.create("jpa")
    jpa("org.apache.openjpa:openjpa-all:2.3.0")
    jpa("org.postgresql:postgresql")
}

tasks {
    register<JavaExec>("genSchema") {
        classpath = configurations["jpa"]
        main = "org.apache.openjpa.jdbc.schema.SchemaTool"
        args = mutableListOf(
                "-properties", "config/openjpa.xml",
                "-action", "reflect",
                "-file", "build/schema.xml"
        )
    }

    register<JavaExec>("genEntity") {
        dependsOn("genSchema")
        classpath = configurations["jpa"]
        main = "org.apache.openjpa.jdbc.meta.ReverseMappingTool"
        args = mutableListOf(
                "-properties", "config/openjpa.xml",
                "-metadata", "none",
                "-annotations", "true",
                "-nullableAsObject", "true",
                "-useGenericCollections", "true",
                "-directory", "src/main/java/${project.group}/${project.name}/entity",
                "-pkg", "${project.group}.${project.name}.entity",
                "build/schema.xml"
        )
    }
}

Этот подход имеет свои преимущества:

  • Автоматизация: После первого настроя openjpa.xml процесс становится почти автоматизированным.
  • Гибкость и настройки: Вы можете настроить скрипты для генерации классов под ваши требования, что позволяет легко смотреть на структуру вашей базы данных.
  • Открытый исходный код: OpenJPA — это проект с открытым исходным кодом, что позволяет вам изменять и подстраивать его под ваши нужды.

2. Альтернативные инструменты

Есть несколько других инструментов и фреймворков, которые также могут помочь с этой задачей. Рассмотрим некоторые из них:

  • JOOQ: JOOQ (Java Object Oriented Querying) позволяет генерировать классы Java из вашей схемы базы данных. Он имеет полную поддержку SQL и предоставляет API для типобезопасного запроса данных. JOOQ это альтернативный подход к JPA, предоставляющий больше контроля за SQL на более низком уровне.

  • Spring Data JPA: Если вы используете Spring, Spring Data предлагает удобные механизмы для работы с JPA и может помочь облегчить взаимодействие с базой данных. Хотя это не совсем инструмент для генерации классов, он предлагает более высокоуровневые абстракции для работы с JPA.

  • Hibernate JPA 2.2: Несмотря на ваши негативные впечатления от Hibernate-Tools, новая версия Hibernate 5+ имеет улучшенные инструменты и поддержку. Hibernate Reverse Engineering позволяет автоматически генерировать классы JPA, основываясь на вашей базе данных.

  • JPA Buddy: Это современный IDE-плагин для IntelliJ IDEA, который предлагает возможности автоматической генерации кода, включая классы JPA. Это инструмент с хорошим интерфейсом, что облегчает процесс настройки.

  • Online Tools: Существует несколько онлайн-инструментов, таких как Hibernate Tools Online и другие, которые помогут визуализировать структуру вашей базы данных и генерировать классы JPA из таблиц. Например, вы можете найти утилиты, которые позволяют загружать вашу структуру базы данных и экспортировать необходимый код.

Заключение

Выбор инструментов для генерации классов JPA зависит от ваших конкретных нужд и предпочтений. OpenJPA с использованием Gradle — отличный выбор, который вы уже используете, но также стоит изучить альтернативы, такие как JOOQ, Spring Data JPA или IDE-плагины для улучшения работы с JPA. Это может значительно облегчить процесс и снизить вероятность возникновения ошибок.

Если у вас есть вопросы по конкретным инструментам или настройкам, не стесняйтесь задавать дополнительные вопросы.

Оцените материал
Добавить комментарий

Капча загружается...