3

我有一个实体类,我希望hibernate用一些常量值填充数据库中的相应表:有一些数据的几行(如果其中没有值,或者替换......)我怎样才能让hibernate做到这一点(理想情况下带有注释)?

我正在使用休眠 3.2 和 spring 3.1。

提前致谢!!!

4

2 回答 2

2

默认情况下,如果类路径的根目录中存在此类文件,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 文件。

于 2012-08-07T13:26:40.383 回答
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.")
        }

    }
}

另请参阅如何测试表是否为空

于 2012-08-07T12:52:06.503 回答