此规则会标记 JPA 项目,这些项目使用级联策略 PERSIST、MERGE 或 ALL 来定义与 JPA 实体的关系,让您注意 WebSphere Application Server V8.5 和 Liberty 的 JPA 2.0 实现中的缺省行为更改。 在 V8.5 之前,如果对持久存储进行级联,那么会检查数据库以查看实体是否已经存在。 新的缺省行为是不先检查,并抛出“实体键已存在”持久性异常(如果该实体已在数据库中)。 行为更改的好处是通过避免对数据库进行额外访问来提升性能。
此行为更改不会影响大多数应用程序。 为了利用新行为,您可以先在 V8.5 环境中尝试运行应用程序,然后更改代码或者还原为先前行为。
如果确实遇到问题,或者您知道应用程序编写成期望持久存储操作首先在数据库中查找新实体,并且不处理可能的新持久性异常,那么可以通过在 persistence.xml 中设置 openjpa.Compatibility 属性来还原为先前行为:
如果您不想更改应用程序,那么也可以将该属性设为服务器 JVM 系统属性。
有一个 Java 规则和一个 XML 规则与此潜在的应用程序问题相关联,有助于提高您的认知度。 即使在多个位置定义了级联持久存储,也只对每个项目标记一个结果。 这让您有机会就此问题评估整个应用程序。
尤其是,您应该评估对 EntityManager 操作 persist 和 merge 的调用,以确定该代码是否将正确地处理行为更改。
评估应用程序之后,可以在分析配置中关闭此规则,或者忽略生成的结果。
该 Java 规则将标记关系注释中所定义的下列任一级联策略:
例如,将在 @OneToOne 等关系注释中标记级联类型。
该 XML 规则将标记 orm.xml 文件中对实体定义的下列任一级联策略:
如果看到其中的任一项已标记,那么您应该评估特定代码,该代码正在对使用级联样式 persist 或 merge 的实体上的 merge 或 persist 进行调用。 如果应用程序代码希望将首先检查数据库,然后插入新实体,那么应用程序可能会遇到行为更改。
如果将 openjpa.Compatibility 属性添加到 persistence.xml,请再次运行分析以确保在相关的检查有关 ListAttribute 的 JPA 元模型代码生成操作中的behavior changes规则上没有新的结果。
有关更多信息,