如果为空,则hibernate填充表

时间:2012-08-07 12:40:22

标签: hibernate auto-populate

我有一个实体类,我希望hibernate使用一些常量值填充DB中的相应表:带有一些数据的几行(如果没有值,或者替换...) 我如何要求hibernate执行此操作(理想情况下使用注释)?

我正在使用hibernate 3.2和spring 3.1。

提前致谢!!!

2 个答案:

答案 0 :(得分:1)

默认情况下,如果类路径的根目录中存在此类文件,则Hibernate会尝试加载文件“import.sql”(或属性hibernate.hbm2ddl.import_files指定的文件)的内容。因此,一个“解决方案”是创建一个只包含一个值的表,并具有唯一约束。当Hibernate尝试加载文件时,由于唯一约束,它将无法第二次加载它。我没有测试过这个,但我认为它应该可行。

现在,如果这听起来不好(对我而言),那么我建议你看看Hibernate用来导入这个文件的代码:

https://github.com/hibernate/hibernate-orm/blob/4.1.5.Final/hibernate-core/src/main/java/org/hibernate/tool/hbm2ddl/SchemaExport.java#L432

我将它作为@Singleton @Startup EJB或作为上下文监听器或类似的东西来实现。我的想法是每次应用程序启动时运行它。然后代码将检查数据库是否为空,并在需要时导入SQL文件。

答案 1 :(得分:0)

您希望何时填充表格?

我们在应用程序启动时检查数据库状态,并使用Spring ContextLoaderListener填充一些表是空的 - 如下所示:

public class ExampleContextLoaderListener extends ContextLoaderListener {
    private static Log LOG = LogFactory.getLog("ContextLoaderListener");

    public void contextInitialized(final ServletContextEvent event) {

        super.contextInitialized(event);

        final DBService dbService =
            getCurrentWebApplicationContext().getBean(DBService.class);
        if (!db.initalized()) {
            LOG.info("DB empty ... adding new data");
            // etc.
        } else {
            LOG.info("DB already initalized.")
        }

    }
}

另见how to test if a table is empty