【问题标题】:How to use JPA 2.1 property javax.persistence.schema-generation.database.action?如何使用 JPA 2.1 属性 javax.persistence.schema-generation.database.action?
【发布时间】:2016-03-30 14:17:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java jpa jpa-2.1


    【解决方案1】:

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

    "none" 意味着什么都不做......所以就像 JPA 一直在做的事情,即坚持不懈。它不是为了“服务任何目的”,只是为了不做任何额外的事情!

    "create" 表示为实体创建表(因此假定它还不存在)。显然,大多数 JPA 提供程序会在创建表之前检查表是否存在,因此它不会“在后续使用中失败”。

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

    "drop-and-create" 删除并为实体创建表,因此摆脱那里的内容并从头开始。与持久化数据无关,但这些选项都不是。

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

    【讨论】:

    • 确实如此,但它仍然是特定于服务器/JPA 供应商的。例如,在 Glassfish 4+/Payara 上,我注意到在您完全取消部署并重新部署应用程序之前,模式生成并不会真正触发。
    • 感谢您的解释。如果clear 的效果取决于JPA 提供者,那么就没有明确的跨提供者方法,对吧?
    • @Karl Richter,你说的清楚是什么意思?清除表的数据库?
    • 您可以使用“创建”并且不会在后续使用中失败,这是否正确?这适用于德比吗?
    • 我同意这些选项大多无用的结论。例如如果数据中有约束会发生什么?在删除表格之前,他们会先被禁用吗?最初本章是为第一个 EE7“Java EE for Cloud”提案而设计的,该提案后来被废弃 - 有充分的理由。几乎只保留了 JPA 部分。只有最小的有用部分是使用 'javax.persistence.schema-generation.scripts.drop-target' 将 SQL 写入文件。但无论如何,每个 JPA 提供者都可以通过专有方式做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2020-01-10
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2017-07-12
    相关资源
    最近更新 更多