如何使用JPA 2.1属性javax.persistence.schema-generation.database.action?

时间:2015-12-24 05:21:27

标签: java jpa jpa-2.1

javax.persistence.schema-generation.database.action的允许值为

  • none(没有任何东西......)
  • create(仅在第一次启动应用程序时才起作用,因为如果已创建已存在的架构,则由于大多数数据库(例如derby 11.x)的所有进一步启动失败,
  • drop-and-create(它不会持久存在任何引发问题的数据,为什么它是持久性标准规范的一部分 - 假设调试目的)
  • drop(对称失败create成功

绝对没有任何选项可以使用这些值,也不会在其规范中看到任何意义 - 假设您不希望应用程序的用户启动应用程序一次(使用create) ,破解persistence.xml文件,重新打包您的应用程序并将其与none一起使用。那么如何使用它们在应用程序重启时持久化Java对象呢?

我知道Hibernate的hibernate.hbm2ddl.auto效果很好,但是我试图通过JPA 2.1实现便携式方法来解决这个问题。

1 个答案:

答案 0 :(得分:7)

几乎没有任何谜(它们在规范中定义,或者在任何体面的JPA实现的文档中定义)。这在创建EMF时运行(或者如果通过持久性调用,则作为单独的前期操作)。

"none"意味着什么都不做......所以像JPA一样做的事情就是持久性。它不会用于任何目的,只是为了不做任何额外的事情!

"create"表示为实体创建表(因此假设它不存在)。很明显,大多数JPA提供商会在创建之前检查表的存在,因此它不会在后续使用中失败"。

"drop"表示删除实体的表(因此,当作为独立进程运行时,请在测试后清理)。

"drop-and-create"删除并为实体创建表,所以摆脱那些并从头开始。与持久化数据无关,但这些选项都没有。

如上所述,其中一些选项对测试最有用。在现实世界中,大多数人会生成DDL,对其进行优化以满足其DBA要求,并手动生成,然后运行JPA,因此在运行时不使用此属性