Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JPA2.1属性javax.persistence.schema-generation.database.action?_Java_Jpa_Jpa 2.1 - Fatal编程技术网

如何使用JPA2.1属性javax.persistence.schema-generation.database.action?

如何使用JPA2.1属性javax.persistence.schema-generation.database.action?,java,jpa,jpa-2.1,Java,Jpa,Jpa 2.1,javax.persistence.schema generation.database.action的允许值为 无(不提供任何服务…) 创建(仅在应用程序第一次启动时起作用,因为由于大多数数据库(例如derby 11.x)的原因,所有后续启动都会失败,如果创建了一个已经存在的架构,则会失败) 删除并创建(这将永远不会持久化任何数据,这会引发一个问题:为什么它是持久化标准规范的一部分?假设是为了调试) 删除(对称失败create成功 这使得绝对没有选择使用这些值中的任何一个,我也看不出它们的

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

  • 无(不提供任何服务…)
  • 创建(仅在应用程序第一次启动时起作用,因为由于大多数数据库(例如derby 11.x)的原因,所有后续启动都会失败,如果创建了一个已经存在的架构,则会失败)
  • 删除并创建(这将永远不会持久化任何数据,这会引发一个问题:为什么它是持久化标准规范的一部分?假设是为了调试)
  • 删除(对称失败
    create
    成功
这使得绝对没有选择使用这些值中的任何一个,我也看不出它们的规范有任何意义-假设您不希望应用程序的用户启动应用程序一次(使用
创建
),破解
persistence.xml
文件,重新打包应用程序,并将其与
none
一起使用。那么,如何在应用程序重新启动时使用它们来持久化Java对象呢

我知道Hibernate的
Hibernate.hbm2ddl.auto
非常有效,但我正试图为JPA 2.1实现的可移植方法解开谜团。

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

“none”
意味着什么都不做……所以像JPA一样做事就是坚持。它不是为了“服务于任何目的”,只是为了不做任何额外的事情

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

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

“拖放并创建”
拖放并创建实体的表,因此,摆脱原有的内容,从头开始。与持久化数据无关,但这些选项都不可用


如前所述,其中一些选项对测试非常有用。在现实世界中,大多数人会生成DDL,对其进行细化以满足DBA要求,然后手动生成,然后只运行JPA,因此在运行时不使用此属性。这一点非常正确,但它仍然有点特定于服务器/JPA供应商。例如,在Glassfish 4+/Payara上我注意到,直到完全取消部署并重新部署应用程序,模式生成才会真正触发。感谢您的解释。如果
clear
的效果取决于JPA提供程序,那么就没有明确的跨提供程序方法,对吗?@Karl Richter,你说的clear是什么意思?清除数据库中的表?是corr吗可以使用“创建”的ect在以后的使用中不会失败吗?这是否适用于Derby?我确实同意这些选项基本上是无用的结论。例如,如果数据中存在约束,会发生什么?它们是否在删除表之前先被禁用?最初,本章是为第一个被废弃的EE7“Java EE for Cloud”提案设计的ter-有很好的理由。几乎只有JPA部分保留了下来。唯一最有用的部分是使用“javax.persistence.schema generation.scripts.drop target”将SQL写入文件。但每个JPA提供程序都可以以专有方式这样做。