使用EclipseLink在运行时重新创建数据库

时间:2016-07-07 17:38:40

标签: java database entity 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

在Hibernate中做到这一点

2 个答案:

答案 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都将反映这些更改。