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

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

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

Ответы [ 4 ]

6 голосов
/ 14 февраля 2018

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

См. http://www.telosys.org/cli.html

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

3 голосов
/ 05 декабря 2014

Для пользователей 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

3 голосов
/ 08 апреля 2015

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

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

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

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

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

Создание схемы xml (из базы данных MSSQL в моем случае, следовательно, драйвер находится в пути к классам):

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):

<?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):

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) }
    }
}
1 голос
/ 12 мая 2011

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

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

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

...