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