настройка hyperjaxb для создания сопоставлений гибернации и базы данных mysql

Я использую hyperjaxb для создания классов Java из файла xsd. Как я могу настроить его для создания аннотаций спящего режима и запускать hbm2ddl для создания базы данных MySQL с таблицами для сгенерированных классов?

Я скачал образец заказа на покупку для спящего режима по этой ссылке, а затем перешел в целевой каталог. в cmd.exe и запустил mvn clean install, но полученные папки не содержали никаких классов Java, и это также не содержало спящего режима/MySQL. Я хотел бы получить рабочий пример, который создает все из загруженного файла xsd, чтобы я мог просто подключить свой собственный файл xsd к коду и автоматически сгенерировать все java/hibernate/mysql. Таким образом, я могу потратить свое время на настройку моего файла xsd, чтобы полученный java/hibernate/MySQL был таким, каким мне нужно.

Пример кода или пошаговые инструкции были бы очень полезны. Я использую затмение.


**РЕДАКТИРОВАТЬ: **

Ответ на этот вопрос пришел после публикации нескольких других вопросов. Чтобы найти полный ответ на этот вопрос, вам нужно просмотреть ответы на эти другие вопросы, в частности, тот, что по этой ссылке.


person CodeMed    schedule 08.10.2014    source источник
comment
Я не могу открыть ссылку confluence.highsource.org/display/HJ3/Downloads . Пишет, что услуга недоступна.   -  person Prakash Panjwani    schedule 19.10.2016


Ответы (2)


ОБНОВЛЕНИЕ

Наконец выяснилось, что ОП ищет сгенерированные классы в корневом каталоге проекта вместо target\generated-source\xjc, несмотря на руководство четко указывает, где искать:

Если вы просмотрите каталог target/generated-sources/xjc, вы найдете несколько сгенерированных java-файлов, например PurchaseOrderType.java.


Я не понимаю, когда вы говорите, что ничего не генерируется. Только что перепроверил, все работает.

Мои шаги:

  • Скачать hyperjaxb3-ejb-samples-po-initial-0.5.6-maven-src.zip
  • Распаковать
  • Перейти к гиперjaxb3-ejb-samples-po-initial-0.5.6
  • mvn чистая установка

Вот что я получаю:

[INFO] ------------------------------------------------------------------------
[INFO] Building Hyperjaxb3 Samples [po-initial:maven] 0.5.6
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[INFO] Deleting C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\target
[INFO] 
[INFO] --- maven-hyperjaxb3-plugin:0.6.0:generate (default) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[INFO] Sources are not up-to-date; XJC execution will be executed.
[WARNING] According to the Java Persistence API specification, section 2.1, entities must be top-level classes:
"The entity class must be a top-level class."
Your JAXB model is not customized as with top-level local scoping, please use the <jaxb:globalBinding localScoping="toplevel"/> global bindings customization.
        org.jvnet.hyperjaxb3.ejb.plugin.EjbPlugin

[WARNING] According to the Java Persistence API specification, section 2.1, entities must implement the serializable interface:
"If an entity instance is to be passed by value as a detached object
(e.g., through a remote interface), the entity class must implement
 the Serializable interface."
Your JAXB model is not customized as serializable, please use the <jaxb:serializable/> global bindings customization element to make your model serializable.
        org.jvnet.hyperjaxb3.ejb.plugin.EjbPlugin

[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 5 source files to C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 5 source files to C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\target\test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[INFO] Surefire report directory: C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running RoundtripTest
Detected [file:/C:/Projects/workspaces/hj3/dist/hyperjaxb3-ejb-samples-po-initial-0.5.6/target/classes/META-INF/persistence.xml].
    RoundtripTest

Loading entity manager factory properties.
    RoundtripTest

Loading entity manager factory properties from [file:/C:/Projects/workspaces/hj3/dist/hyperjaxb3-ejb-samples-po-initial-0.5.6/target/test-classes/persistence.properties].
    RoundtripTest

Testing samples.
    RoundtripTest

Sample directory [C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\src\test\samples].
    RoundtripTest

Testing sample [po.xml].
    RoundtripTest

Unmarshalling.
    RoundtripTest

Opening session.
    RoundtripTest

Saving the object.
    RoundtripTest

Opening session.
    RoundtripTest

Loading the object.
    RoundtripTest

Closing the session.
    RoundtripTest

Initial object:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purchaseOrder orderDate="1999-10-20">
    <shipTo country="US">
        <name>Alice Smith</name>
        <street>123 Maple Street</street>
        <city>Mill Valley</city>
        <state>CA</state>
        <zip>90952</zip>
    </shipTo>
    <billTo country="US">
        <name>Robert Smith</name>
        <street>8 Oak Avenue</street>
        <city>Old Town</city>
        <state>PA</state>
        <zip>95819</zip>
    </billTo>
    <comment>Hurry, my lawn is going wild!</comment>
    <items>
        <item partNum="872-AA">
            <productName>Lawnmower</productName>
            <quantity>1</quantity>
            <USPrice>148.95</USPrice>
            <comment>Confirm this is electric</comment>
        </item>
        <item partNum="926-AA">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>39.98</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>
</purchaseOrder>

    RoundtripTest

Source object:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purchaseOrder orderDate="1999-10-20" Hjid="1">
    <shipTo country="US" Hjid="2">
        <name>Alice Smith</name>
        <street>123 Maple Street</street>
        <city>Mill Valley</city>
        <state>CA</state>
        <zip>90952</zip>
    </shipTo>
    <billTo country="US" Hjid="1">
        <name>Robert Smith</name>
        <street>8 Oak Avenue</street>
        <city>Old Town</city>
        <state>PA</state>
        <zip>95819</zip>
    </billTo>
    <comment>Hurry, my lawn is going wild!</comment>
    <items Hjid="1">
        <item partNum="872-AA" Hjid="1">
            <productName>Lawnmower</productName>
            <quantity>1</quantity>
            <USPrice>148.95</USPrice>
            <comment>Confirm this is electric</comment>
        </item>
        <item partNum="926-AA" Hjid="2">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>39.98</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>
</purchaseOrder>

    RoundtripTest

Result object:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purchaseOrder orderDate="1999-10-20" Hjid="1">
    <shipTo country="US" Hjid="2">
        <name>Alice Smith</name>
        <street>123 Maple Street</street>
        <city>Mill Valley</city>
        <state>CA</state>
        <zip>90952</zip>
    </shipTo>
    <billTo country="US" Hjid="1">
        <name>Robert Smith</name>
        <street>8 Oak Avenue</street>
        <city>Old Town</city>
        <state>PA</state>
        <zip>95819</zip>
    </billTo>
    <comment>Hurry, my lawn is going wild!</comment>
    <items Hjid="1">
        <item partNum="872-AA" Hjid="1">
            <productName>Lawnmower</productName>
            <quantity>1</quantity>
            <USPrice>148.95</USPrice>
            <comment>Confirm this is electric</comment>
        </item>
        <item partNum="926-AA" Hjid="2">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>39.98</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>
</purchaseOrder>

    RoundtripTest

Checking the document identity.
    RoundtripTest

Finished testing sample [po.xml].
    RoundtripTest

Finished testing samples.
    RoundtripTest

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.552 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[INFO] Building jar: C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\target\hyperjaxb3-ejb-samples-po-initial-maven-0.5.6.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ hyperjaxb3-ejb-samples-po-initial-maven ---
[INFO] Installing C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\target\hyperjaxb3-ejb-samples-po-initial-maven-0.5.6.jar to C:\Repository\org\jvnet\hyperjaxb3\hyperjaxb3-ejb-samples-po-initial-maven\0.5.6\hyperjaxb3-ejb-samples-po-initial-maven-0.5.6.jar
[INFO] Installing C:\Projects\workspaces\hj3\dist\hyperjaxb3-ejb-samples-po-initial-0.5.6\pom.xml to C:\Repository\org\jvnet\hyperjaxb3\hyperjaxb3-ejb-samples-po-initial-maven\0.5.6\hyperjaxb3-ejb-samples-po-initial-maven-0.5.6.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.100 s
[INFO] Finished at: 2014-10-09T00:42:10+01:00
[INFO] Final Memory: 22M/96M
[INFO] ------------------------------------------------------------------------

Полный журнал mvn clean install -X находится здесь.

Итак, я надеюсь, вы видите, что это работает отлично. Напишите, пожалуйста, mvn clean install -X, может вы что-то не так делаете.

Теперь, что касается вашего вопроса, вот пример MySQL:

https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/po-mysql

Этот проект включает в себя фрагмент генерации hbm2ddl:

https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/issues

hbm2ddl по какой-то причине закомментирован, не уверен, что он работает, но он должен указывать направление.

person lexicore    schedule 08.10.2014
comment
@CodeMed Что??? Он генерирует все, круговой тест работает нормально, где вы ищете классы, на самом деле? - person lexicore; 09.10.2014
comment
Тогда загляните в target/generated-sources/xjc. :) Этот каталог явно предлагается в учебнике: если вы просмотрите каталог target/generated-sources/xjc, вы найдете несколько сгенерированных java-файлов, например PurchaseOrderType.java. confluence.highsource.org/display/HJ3/ ? - person lexicore; 09.10.2014
comment
Не уверен, каково ваше намерение. Примеры находятся здесь: github.com/highsource/hyperjaxb3/tree/master/ejb/ образцы, шаблоны находятся здесь: github.com/highsource/hyperjaxb3/ tree/master/ejb/templates, но это не обычные проекты, они созданы как примеры. т.е. pom.xml из этих проектов просто создают .zip с примерным содержимым. Вам лучше посмотреть на github.com/highsource/hyperjaxb3/tree/master/ejb/ тесты для исполняемых тестов. - person lexicore; 09.10.2014
comment
@CodeMed Не уверен, что вы подразумеваете под импортом в src/main/java. Откройте свойства проекта, выберите «Путь сборки Java», перейдите на вкладку «Источник», убедитесь, что установлен флажок «Разрешить выходные папки для исходных папок», нажмите кнопку «Добавить папку...», разверните цель, разверните сгенерированный источник, проверьте xjc, нажмите «ОК» и нажмите ОК. Это добавляет каталог, в котором создаются файлы Java, к пути к классам. - person Rob; 09.10.2014
comment
@CodeMed Это плагин maven, который я использую для запуска hbm2ddl: ‹groupId›de.smartics.maven.plugin‹/groupId› ‹artifactId›hibernate4-maven-plugin‹/artifactId› ‹version›0.2.0‹/version› - person Rob; 09.10.2014
comment
@CodeMed На этот вопрос дан ответ. Если у вас есть дополнительные вопросы по использованию Eclipse, задайте их как отдельный вопрос. Это, безусловно, работает в Eclipse. - person lexicore; 09.10.2014
comment
Это абсолютно стандартная структура каталогов Maven, полностью совместимая с Eclipse/m2e. Все обычные плагины генерации кода Maven генерируют код в формате target\generated-sources\something. Дайте мне знать, если вы хотите, чтобы мой честный отзыв о ваших усилиях. - person lexicore; 10.10.2014
comment
@lexicore, даже когда я помещаю свой класс Main.java в target/generated-sources/xjc, я все равно получаю Launch Error: Selection does not contain a main type, когда пытаюсь запустить код из вашего руководства в качестве приложения Java. Напротив, я могу запустить аналогичный Main.java в проекте eclipse, который я использовал для импорта JAXB. Вы используете другую структуру каталогов, чем использует Oracle. - person CodeMed; 10.10.2014
comment
Извините, но заявления о том, что ваша структура каталогов не соответствует способу настройки проектов eclipse, и вы используете другую структуру каталогов, чем использует Oracle, неверны. Позвольте мне ответить на другой вопрос, я объясню. - person lexicore; 10.10.2014
comment
@lexicore Я имею в виду, что я смог без проблем подключить код, сгенерированный JAXB, к различным типам проектов eclipse. Напротив, код, сгенерированный Hyperjaxb, выдает ошибки, когда я импортирую его в каждый из тех же типов проектов eclipse, которые я пробовал. Я не хочу критиковать вас или ваш многообещающий проект. Я просто пользователь eclipse, который привык без проблем подключать вещи к eclipse. Я с нетерпением жду вашего ответа на другой вопрос. Еще раз спасибо. - person CodeMed; 10.10.2014
comment
Моя трудность в том, что вам, похоже, не хватает базовых концепций проектов Maven. Вы просто делаете неправильные вещи. - person lexicore; 10.10.2014
comment
Я только что опубликовал свой ответ. Нет, вы ошибаетесь насчет IDE. В профессиональных проектах скрипты сборки (будь то Ant, Maven или что-то еще) обязательны и первичны. IDE совершенно вторична. Вам даже не обязательно иметь его. Хотите доказательство? Найдите проекты с открытым исходным кодом без файлов сборки (pom.xml и т. д.), но с файлами IDE, зарегистрированными в SCM. Вы вряд ли найдете. Одноэтапные сборки необходимы. - person lexicore; 10.10.2014
comment
Ответ на этот вопрос требует интеграции ответов на несколько разных вопросов, включая этот: stackoverflow.com/questions/26366556/ - person CodeMed; 15.10.2014

Это часть другого ответа, который отвечает на часть MySQL. Я добавляю это здесь для дальнейшего использования, пытаясь закрыть этот вопрос.

Итак, с этого момента я предполагаю, что руководство по заказу покупателя работало нормально: был сгенерирован код, выполнен круговой тест с базой данных HSQLDB и т. д.

Теперь разберем два вопроса:

  • Как перейти на MySQL?
  • Как сгенерировать схему базы данных с помощью hbm2ddl?

Давайте начнем.

Переход на MySQL

Прежде всего, вы должны заменить HSQLDB на MySQL в файле pom.xml. Удали это:

    <dependency>
        <groupId>hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>1.8.0.7</version>
        <scope>test</scope>
    </dependency>

И добавьте это:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.0.5</version>
        <scope>test</scope>
    </dependency>

Затем отредактируйте src/test/resources/persistence.properties. Замените это:

hibernate.dialect=org.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class=org.hsqldb.jdbcDriver
hibernate.connection.username=sa
hibernate.connection.password=
hibernate.connection.url=jdbc:hsqldb:target/test-database/database
hibernate.hbm2ddl.auto=create-drop
hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider
hibernate.jdbc.batch_size=0

С этим:

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.username=...
hibernate.connection.password=...
hibernate.connection.url=jdbc:mysql://localhost/hj3
hibernate.hbm2ddl.auto=create-drop
hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider
hibernate.jdbc.batch_size=0

Лично у меня сейчас нет под рукой базы данных MySQL, поэтому я не могу протестировать туда-обратно. Поэтому я закомментирую

<!--roundtripTestClassName>RoundtripTest</roundtripTestClassName-->

in pom.xml.

Если у вас есть база данных, просто настройте правильный URL/имя пользователя/пароль в упомянутом файле persistence.properties.

На этом этапе ваш проект Maven переконфигурирован для использования MySQL. Если циклический тест не закомментирован и база данных доступна, круговой тест должен выполняться с БД, т. е. создать схему, импортировать образец XML, прочитать его и сравнить альфа и омега.

Итак, у нас есть руководство по MySQL, и мы можем двигаться дальше.

Создание схемы базы данных

Это была сложная часть, чтобы понять.

Чтобы создать схему базы данных в файле, вы должны использовать инструмент hbm2ddl. Для этого есть плагины Maven, в случае с Hibernate 3 казалось, что плагин Codehaus является ведущим. Наконец, я выяснил следующую конфигурацию. Вы должны добавить следующий плагин к вашему pom.xml (project/build/plugins):

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>hibernate3-maven-plugin</artifactId>
            <version>3.0</version>
            <executions>
                <execution>
                    <id>generate-schema</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <hibernatetool>
                    <classpath>
                        <path location="${project.build.directory}/classes" />
                    </classpath>

                    <jpaconfiguration persistenceunit="org.jvnet.hyperjaxb3.ejb.tests.pocustomized" propertyfile="src/test/resources/persistence.properties"/>

                    <hbm2ddl export="false" create="true" update="false" format="true" outputfilename="schema.ddl" />

                </hibernatetool>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.hibernate.javax.persistence</groupId>
                    <artifactId>hibernate-jpa-2.0-api</artifactId>
                    <version>1.0.0.Final</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-entitymanager</artifactId>
                    <version>3.6.5.Final</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.0.5</version>
                </dependency>
            </dependencies>
        </plugin>

Несколько вещей важны:

  • Hyperjaxb3 генерирует аннотации JPA, поэтому вы должны использовать jpaconfiguration.
  • Поэтому hibernate3-maven-plugin должен быть выполнен на этапе компиляции (вам нужны классы для чтения аннотаций, поэтому они должны быть скомпилированы в этот момент).
  • Вы должны включить скомпилированные классы (${project.build.directory}/classes) в путь к классам hibernatetool, чтобы он мог обнаруживать классы и читать аннотации.
  • Вы должны сообщить hibernatetool, где вы найдете свои свойства Hibernate (propertyfile="src/test/resources/persistence.properties").
  • Наконец, вы должны сообщить ему, какую единицу персистентности вы хотите обработать (persistenceunit="org.jvnet.hyperjaxb3.ejb.tests.pocustomized"). Взгляните на target/generated-sources/xjc/META-INF/persistence.xml.
  • Наконец, добавьте все необходимые зависимости.

Наконец, вы пришли к конфигурации, которую я разместил выше. На этом этапе сборка также должна сгенерировать схему базы данных в target/sql/hibernate3/schema.ddl.

person lexicore    schedule 13.10.2014