Существует ли какой-либо инструмент командной строки, который может генерировать классы сущностей Java из db (НЕ Netbeans или Eclipse wizard)

#java #command-line #entity #dao

#java #командная строка #сущность #dao

Вопрос:

Раньше я использовал Netbeans wizard (версия 6.7.1) для генерации классов сущностей из базы данных. Теперь я хочу поискать независимый инструмент (скрипт, инструмент командной строки …), который может выполнять ту же задачу, потому что некоторые разработчики в моей команде используют Eclipse вместо Netbeans или Netbeans, но другой версии (т. Е. 6.9.1 или 7.0 …), и эти IDE генерируют классы сущностей по-разному.

До сих пор я не нашел ни одного независимого инструмента, подобного этому. Возможно, я что-то пропустил. Если вы знаете один, пожалуйста, скажите мне. Я это очень ценю.

Комментарии:

1. Поскольку задача настолько мала и четко определена, конечно, есть небольшие инструменты, которые делают именно это. И у многих огромных, дорогих инструментов есть опция / программа / мастер для выполнения того же. Но я обнаружил, что создание 30-50 строк Perl на самом деле намного быстрее, чем поиск одного инструмента, который делает это именно так, как вы хотите. Поскольку ваши коллеги уже не могут договориться об инструментах, возможно, стоит написать свой собственный крошечный адаптируемый скрипт.

Ответ №1:

Вы можете использовать версию CLI (интерфейс командной строки) генератора кода Telosys

Смотрите https://www.telosys.org/cli.html

Документация: https://doc.telosys.org /

Этот инструмент можно использовать совместно с любым типом IDE

Ответ №2:

Я оказался в аналогичной ситуации, и после довольно продолжительных поисков единственным инструментом, который я нашел, который поддерживает это из командной строки, является Apache OpenJPA.

Требуется небольшая настройка, чтобы заставить его работать, но, похоже, он выполняет свою работу. Это работает следующим образом:

  1. Создайте XML-файл из существующей схемы DB с помощью инструмента Schema.
  2. При желании отредактируйте сгенерированный xml по своему вкусу (я запускаю весь этот процесс с помощью задачи Gradle, поэтому я использовал Groovy для удаления некоторых ненужных таблиц из схемы)
  3. Генерируйте классы сущностей JPA из .xml, используя инструмент обратного сопоставления (у вас недостаточно репутации, чтобы публиковать более 2 ссылок, извините). Этот инструмент также может использовать дополнительный класс customizer, который вы можете использовать для дальнейшей настройки сгенерированного кода.

Хотя в документации к этим инструментам указано, что достаточно иметь properties.xml файл в вашем classpath, чтобы заставить их работать, для меня они работали только тогда, когда я явно указал им на файл с аргументом ‘-properties’.

И вот несколько фрагментов кода, чтобы сэкономить время любому, кто читает это. Это было протестировано с OpenJPA 2.3.0:

Сгенерируйте XML-схему (в моем случае из базы данных MSSQL, следовательно, драйвер находится в classpath):

 java -cp openjpa-all-2.3.0.jar;sqljdbc4.jar org.apache.openjpa.jdbc.schema.SchemaTool -properties openjpa.xml -action reflect -file schema.xml
  

Генерировать сущности из xml:

 java -cp openjpa-all-2.3.0.jar org.apache.openjpa.jdbc.meta.ReverseMappingTool -properties openjpa.xml -metadata none -annotations true -nullableAsObject true -useGenericCollections true -pkg {your package} -directory {output directory} schema.xml
  

Пример openjpa.xml (Опять же, для MSSQL DB):

 <?xml version="1.0"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <persistence-unit name="Gaya STG">
    <properties>
      <property name="openjpa.ConnectionURL" value="jdbc:sqlserver://{ip}"/>
      <property name="openjpa.ConnectionDriverName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="openjpa.ConnectionUserName" value="{username}"/>
      <property name="openjpa.ConnectionPassword" value="{pass}"/>
      <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
    </properties>
  </persistence-unit>
</persistence>
  

Пример файла build.gradle, который содержит все вышеперечисленное в качестве задач (Опять же, для MSSQL DB):

 import java.util.regex.Pattern

apply plugin: 'java'

dependencies {
    compile "org.apache.openjpa:openjpa-all:2.3.0"
    compile "sqljdbc4:sqljdbc4:sqljdbc4"
}

task cleanSchemaXml(type: Delete) {
    delete file("schema.xml")
}

task generateSchemaXml(type: JavaExec, dependsOn: cleanSchemaXml) {
    classpath = configurations.compile
    main = "org.apache.openjpa.jdbc.schema.SchemaTool"
    args "-properties", getPropertiesFile(),
         "-action", "reflect",
         "-file", "schema.xml"

    doFirst {
        println "Generating schema.xml..."
    }

    doLast {
        println "Done generating schema.xml."
        println "Updating schema.xml..."
        updateSchema()
        println "Done updating schema.xml."
    }
}

task cleanEntities(type: Delete) {
    delete fileTree(dir: "{path/to/your/entities}")
}

task generateEntities(type: JavaExec, dependsOn: [cleanEntities, clean,  generateSchemaXml, jar]) {
    classpath = files(configurations.compile, jar.archivePath)  // Add this module's jar to the executed classpath, so we can use the EntityCustomizer (which is assumed to be in this module).
    main = "org.apache.openjpa.jdbc.meta.ReverseMappingTool"
    args "-metadata", "none",
         "-annotations", "true",
         "-nullableAsObject", "true",
         "-useGenericCollections", "true",
         "-properties", getPropertiesFile(),
//        "-customizerClass", "{path.to.your.EntityCustomizer}",
         "-directory", "{path/to/your/entities}",
         "-pkg", "{your.entity.package}",
         "schema.xml"

    doFirst {
        println "Generating entity classes from schema.xml..."
    }

    doLast {
        println "Done generating entity classes."
    }
}

private String getPropertiesFile() {
    // File is read directly from the file-system, will not work from a Jar.
    return file("src/main/resources/openjpa.xml").getAbsolutePath()
}

private void updateSchema() {
    // Only this schema will be kept.
    final def schemasToKeep = ['dbo']

    // These tables will be removed from the .xml
    final def tablesToRemove = [
        'ReplicationMonitor', 'DDLEvents', 'AuditTrail', 'AuditTrailErrorLog', 'sysdiagrams', 'table_relations',
        'tasks_queue', 'tasks_queue_archive',
        '.*history'    // Remove all tables ending with 'history'.
    ].collect { Pattern.compile(it) }

    final File xmlFile = file('schema.xml')

    // Read xml.
    final def xml = new XmlParser().parse(xmlFile)

    // Remove all unnecessary schemas.
    filterSchemas(xml, schemasToKeep)

    // Remove all unnecessary tables.
    filterTables(xml, tablesToRemove)

    // Save updated xml file.
    new XmlNodePrinter(new PrintWriter(new FileWriter(xmlFile))).print(xml)
}

private void filterSchemas(Node xml, List<String> schemasToKeep) {
    final List<Node> removedSchemas = []
    xml.each { schema ->
        final String name = schema.@name
        if (!schemasToKeep.contains(name)) {
            println("Removing schema: $name")
            removedSchemas  = schema
        }
    }
    removedSchemas.each { xml.remove(it) }
}

private void filterTables(Node xml, List<Pattern> tablesToRemove) {
    xml.each { schema ->
        final List<Node> removedTables = []
        schema.each { table ->
            final String name = table.@name
            if (tablesToRemove.any { it.matcher(name).matches() }) {
                println("Removing table: $name")
                removedTables  = table
            }
        }
        removedTables.each { schema.remove(it) }
    }
}
  

Ответ №3:

Для пользователей Eclipse вам следует использовать плагин Eclipse, такой как «Telosys Tools» (http://marketplace.eclipse.org/content/telosys-tools )

Он делает то, что вы хотите: подключается к базе данных, извлекает схему и генерирует любые исходные файлы, такие как объекты JPA См. Учебные пособия:https://sites.google.com/site/telosystutorial /

Шаблоны JPA здесь:https://github.com/telosys-tools/persistence-jpa-TT210-R2

Комментарии:

1. Теперь доступен интерфейс командной строки, см. github.com/telosys-tools-bricks/telosys-cli/wiki

Ответ №4:

Попробуйте hbm2ddl от Hibernate:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html

Найдите hibernate.hbm2ddl.auto параметр. У него есть опция create.

Комментарии:

1. Как я понимаю, настройка hibernate.hbm2ddl.auto=create предназначена для генерации схемы базы данных. Я все еще не видел связи между вашим решением и моей проблемой. Можете ли вы пояснить?

2. владелец спросил обратное