查看在 EclipseLink 中启动时运行 SQL 脚本,它描述了一种解决方案,该解决方案与 Hibernate 的import.sql
功能1等效。肖恩·史密斯的学分:
有时,在使用 DDL 生成时,首先运行脚本来清理数据库很有用。在 Hibernate 中,如果您在类路径中放置一个名为“import.sql”的文件,其内容将被发送到数据库。就我个人而言,我不是魔术文件名的粉丝,但这可能是一个有用的功能。
EclipseLink 中没有对此的内置支持,但由于 EclipseLink 的高可扩展性,它很容易做到。这是我想出的一个快速解决方案:我只需为会话 postLogin 事件注册一个事件侦听器,然后在处理程序中读取一个文件并将每个 SQL 语句发送到数据库——既好又干净。我更进一步,支持将文件名设置为持久性单元属性。您可以在代码或persistence.xml 中指定这一切。
该类通过持久性单元属性ImportSQL
配置为在事件中读取由“import.sql.file”属性标识的文件。此属性也被指定为传递给的持久性单元属性
。此示例还显示了如何定义和使用自己的持久性单元属性。SessionCustomizer
postLogin
createEntityManagerFactory
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.SessionEvent;
import org.eclipse.persistence.sessions.SessionEventAdapter;
import org.eclipse.persistence.sessions.UnitOfWork;
public class ImportSQL implements SessionCustomizer {
private void importSql(UnitOfWork unitOfWork, String fileName) {
// Open file
// Execute each line, e.g.,
// unitOfWork.executeNonSelectingSQL("select 1 from dual");
}
@Override
public void customize(Session session) throws Exception {
session.getEventManager().addListener(new SessionEventAdapter() {
@Override
public void postLogin(SessionEvent event) {
String fileName = (String) event.getSession().getProperty("import.sql.file");
UnitOfWork unitOfWork = event.getSession().acquireUnitOfWork();
importSql(unitOfWork, fileName);
unitOfWork.commit()
}
});
}
public static void main(String[] args) {
Map<String, Object> properties = new HashMap<String, Object>();
// Enable DDL Generation
properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.DROP_AND_CREATE);
properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
// Configure Session Customizer which will pipe sql file to db before DDL Generation runs
properties.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, "model.ImportSQL");
properties.put("import.sql.file","/tmp/someddl.sql");
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("employee", properties);
}
我不确定它是否是一个严格的等价物,我不确定脚本是否会在数据库生成后运行。需要测试。如果没有,也许它可以适应。
1 Hibernate 有一个简洁的小功能,但文档严重不足且未知。您可以在数据库模式生成后立即在 SessionFactory 创建期间执行 SQL 脚本,以在新数据库中导入数据。您只需在类路径根目录中添加一个名为 import.sql 的文件,并将 create 或 create-drop 设置为 hibernate.hbm2ddl.auto 属性。