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,因此在运行时不使用此属性