出于同样的原因,我遇到了这个问题,试图找到一种在DDL生成后运行初始化脚本的方法。我为一个老问题提供这个答案,希望缩短那些寻求相同解决方案的人的“文学研究”量。
我正在使用GlassFish 4及其默认的EclipseLink 2.5 JPA实现。JPA 2.1 下的新模式生成功能使得在 DDL 生成完成后指定“初始化”脚本变得相当简单。
<?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="cbesDatabase" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:app/jdbc/cbesPool</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/sql/load_script.sql"/>
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
</persistence>
上述配置从元数据(即注释)生成 DDL 脚本,然后运行脚本以填充数据库。在我的例子中,我用测试数据播种几个表,并生成其他视图。META-INF/sql/load_script.sql
有关EclipseLink使用JPA属性的其他信息可以在EclipseLink/Release/2.5/JPA21的DDL生成部分找到。同样,Oracle 的 Java EE 7 教程和 TOTD #187 中的第 37.5 节数据库模式创建也提供了快速介绍。