2016-06-07 1 views
0

Я должен проверить наличие таблиц при запуске сервера. Если они не существуют, я должен создать их с помощью классов сущностей. Возможно ли это? Я использую Eclipse, а мой сервер - wildfly10. Я подключения к Oracle 11g х, но я не думаю, что это база данных, которая вызывает проблемыКак создать таблицы из классов сущностей в JPA на сервере Запуск?

Во всяком случае, это то, что я сделал до сих пор

Мой persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" 
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="Lab5"> 
     <properties> 
      <property name="javax.persistence.schema-generation.database.action" value="create"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

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

HHH000431: Unable to determine H2 database version, certain features may not work 

Я пробовал различные исправления для этого предупреждения нашли на StackOverflow и других сайтах, но они не помогли. Я даже не знаю, связано ли это с моей проблемой.

ответ

2

JPA 2.1 производство DDL часть спецификации. Вы можете использовать свойство persistence «javax.persistence.schema-generation.database.action» со значением «create», чтобы 2.1 провайдеры создавали схему базы данных для вас во время развертывания. JPA может использоваться для создания или даже запуска пользовательских сценариев, если вам нужно изменить процесс создания/срыва таблицы и процесса народонаселения.

Проблема, с которой вы, скорее всего, сталкиваетесь, - это ваша единица персистентности, не указывающая источник данных, оставляя его до контейнера, чтобы выяснить, к которому вы хотите подключиться, и Wildfly должен по умолчанию использовать базу данных H2. Таблицы будут настроены в этой базе данных, но не в базе данных Oracle XE, которую вы ожидаете, поэтому запросы не возвращают никаких значений, и все же в вашей консоли таблицы даже не существуют.

Вам необходимо настроить источник данных в своей базе данных на сервере, а затем указать на него блок персистентности, используя <non-jta-data-source> или <jta-data-source>. Ваш persistence.xml является неполным, поэтому я настоятельно призываю вас сначала посмотреть на блок сохранения демо.

+0

Я определил источник данных в Wildfly и после добавления его в тег теперь он работает (почти), как и предполагалось. Знаете ли вы, можно ли избежать исключения, если таблицы уже существуют? Я не хочу использовать drop-and-create, потому что я не хочу удалять какие-либо данные, если он уже существует – newfolder

2

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

... 
<persistence-unit ...> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    ... 
    <properties> 
    <property name = "hibernate.hbm2ddl.auto" value="create" /> 
    ... 
    </properties> 
</persistence-unit> 

Обратите внимание, что это будет предполагать, что подключение выполнено с пользователем, имеющим необходимые права доступа в БД для создания таблицы. Взгляните на hibernate docs here.

Смежные вопросы