2016-07-07 3 views
0

Есть ли способ динамически воссоздавать базу данных во время выполнения в EclipseLink?Повторно создать базу данных во время выполнения с использованием EclipseLink

Сейчас у меня есть это, что, если база данных не существует, то он создает базу данных во время компиляции:

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
    <persistence-unit name="DefaultUnit" transaction-type="RESOURCE_LOCAL"> 

     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="eclipselink.ddl-generation.output-mode" 
       value="database" /> 
      <property name="eclipselink.logging.level" value="INFO" /> 
      <property name="eclipselink.logging.level.sql" value="INFO" /> 
      <property name="javax.persistence.schema-generation.database.action" 
       value="create" /> 
     </properties> 

    </persistence-unit> 
</persistence> 

Однако, я хочу, чтобы иметь возможность падения, и Воссоздать базу данных, а приложение Бег. I.E, когда пользователь передает некоторый специальный флаг, я хочу вызвать что-то, что приведет к потере текущей базы данных и регенерации.

Я обнаружил, что вы можете сделать это в спящем режиме с помощью SchemaExport class

ответ

0

Вы можете добавить <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> в persistence.xml.

Он удалит всю таблицу и создаст ее снова. Будьте осторожны, все ваши предыдущие данные будут потеряны.

+0

Вот почему я не хочу этого делать. Я хочу только отказаться от таблиц и воссоздать их на основе некоторого флага (который может быть передан как настройка конфигурации) – user171943

0

совершенно. Свойства можно добавлять динамически во время выполнения, поэтому вы можете добавить «eclipselink.ddl-generation» со значением «drop-and-create-tables» при создании EntityManagerFactory в первый раз, когда оно будет удалено и создаст базу данных. Конечно, это не очень полезно для запуска приложения, где вы хотите изменить вещи на лету.

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

Map properties = new HashMap(); 
properties.put("eclipselink.ddl-generation", "drop-and-create-tables"); 
properties.put("eclipselink.ddl-generation.output-mode", "database"); 
//this causes DDL generation to occur on refreshMetadata rather than wait until an em is obtained 
properties.put("eclipselink.deploy-on-startup", "true"); 
JpaHelper.getEntityManagerFactory(em).refreshMetadata(properties); 

Класс org.eclipse.persistence.jpa.JPAHelper используется только разворачивать завод, чтобы получить JpaEntityManagerFactory экземпляр, чтобы сделать вызов, не JPA refreshMetadata. Любое количество свойств или настроек можно изменить, и любые новые EntityManager, полученные после вызова обновления, отражают эти изменения.

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

  • Нет связанных вопросов^_^