0

Hibernate 属性 - hibernate.hbm2ddl.import_files - 只有在 - hibernate.hbm2ddl.auto - 设置为创建时才会被触发。

是否有任何实现来“改变”它?

不是 hibernate.hbm2ddl.import_files 的行为方式......而是一种在系统启动后 Hibernate 插入一些数据的方式(即使创建了表)。执行纯 SQL 脚本无法满足我的需求,因为不会尊重 @Id @GeneratedValue。

最后,我需要一种方法让系统检测数据库中是否存在某些数据,如果不存在,则将其填充。有没有人知道这样做并尊重我的@GeneratedValue 计数器?

4

2 回答 2

2

您可以只创建一个@ApplicationScoped托管 bean,它调用将数据插入数据库的方法。

@ManagedBean(eager = true)
@ApplicationScoped
public class App {

    @PostConstruct
    public void init() {
        myDAO.initDatabaseIfNeeded();
    }
}

该方法myDao.initDatabaseIfNeeded()在应用程序初始化时调用,并且在解决任何依赖关系之后 - 因此在 Hibernate 已经创建了任何表之后。

我最近在 Spring 应用程序上做了类似的事情,所以在我的例子中myDAO实际上是一个 Spring 服务。

于 2013-04-04T00:28:42.440 回答
2

除了 elias 提出的正确答案之外,您还可以添加一个ServletContextListener,因为它可能是实现您的功能的更清晰的方法。为此,您需要实现ServletContextListener接口并使用 注释该类@WebListener,或者在您的 web.xml 中声明它。

public class MyServletContextListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
    initializeDatabase();
}

@Override
public void contextDestroyed(ServletContextEvent sce) {   }

}

然后你要么必须在 web.xml 中添加一个声明:

<listener>
    <listener-class>yourpackage.MyServletContextListener</listener-class>
</listener>

或者,如果您当前使用的是 Servlet 3.0,只需使用@WebListener.

于 2013-04-04T05:35:40.373 回答