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



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

  • 没有(没有任何作用…)
  • create(它只在应用程序第一次启动时起作用,因为如果创建了已经存在的模式,则由于大多数数据库(例如derby 11.x)失败,所有进一步的启动都会失败
  • drop-and-create(它永远不会持久化任何数据,这就提出了为什么它是持久化标准规范的一部分的问题——假设用于调试)
  • 丢弃(对称失败create成功

这绝对没有使用这些值的选择,我也看不出它们的规范有任何意义——假设你不想让应用程序的用户启动应用程序一次(使用create),破解persistence.xml文件,重新打包你的应用程序,并使用none。那么,如何在应用程序重新启动时使用它们来持久化Java对象呢?

我知道Hibernate的hibernate.hbm2ddl.auto,它工作得很好,但我正在努力为JPA2.1实现的可移植方法解开谜团。

几乎没有什么神秘之处(它们在规范中或任何像样的JPA实现的文档中都有定义)。这是在创建EMF时运行的(如果通过Persistence调用,则作为单独的前置操作运行)

"none"的意思是什么都不做。。。所以要像JPA一样一直在做一些事情,比如说坚持。它不是为了"达到任何目的",只是为了不做任何额外的事情!

"create"意味着为实体创建表(因此假设它还不存在)。显然,大多数JPA提供者在创建之前都会检查表的存在性,这样就不会"在后续使用中失败"。

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

"drop-and-create"删除并创建实体的表,所以去掉现有的内容,从头开始。与持久化数据无关,但这些选项都不是。

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

相关内容

最新更新