有没有办法在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
在Hibernate中做到这一点答案 0 :(得分:0)
您可以将apply plugin: 'com.google.gms.google-services'
添加到persistence.xml。
它将删除所有表并再次创建它。请注意,您之前的所有数据都将丢失。
答案 1 :(得分:0)
绝对。可以在运行时动态添加属性,因此当您第一次创建EntityManagerFactory以使其删除并创建数据库时,可以添加值为“drop-and-create-tables”的“eclipselink.ddl-generation”。当然,对于想要动态更改内容的正在运行的应用程序来说,这没什么用处。
为了解决这个问题,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类仅用于解包Factory以获取JpaEntityManagerFactory实例以进行非JPA refreshMetadata调用。可以更改任意数量的属性或设置,刷新调用后获得的任何新EntityManagers都将反映这些更改。