Java 带Hibernate的JPA:新子实体未考虑findDirty-bug还是特性?
我们目前正面临一个新实体和findDirty拦截器的“问题”——从我们的角度看,它看起来像一个bug。然而,它也可能是一个功能-因此,对这个主题的专业知识和评论是非常感谢的 干杯 克里斯托夫 我们的环境: Hibernate 4.2.7(使用JPAAPI 2.x) 问题: 我们有两个实体UserBO和InternalOrganizationBO 两个对象之间的关系如下所示。 两个对象都有一个布尔标志“FlushUpdate”。 此“flushUpdate”标志在我们的自定义findDirty实现(覆盖EmptyInterceptor.findDirty)中计算。 如果“flushUpdate”为false,FindProperty将返回空数组 我们正在做什么: 1.我们从数据库中获取UserBO对象(因此处于托管状态) 2.我们创建一个新的InternalOrganizationBO对象 3.我们将UserBO和InternalOrganizationBO的FlushUpdate标志设置为false 4.我们为用户设置InternalOrganizationBO对象 5.调用entityManager.flush方法 我们认为是一个错误: entityManager.flush方法正在触发InternalOrganizationBO的SQL插入 尽管findDirty方法为这两个对象返回一个空数组,但我们没有返回 为InternalOrganizationBO调用解释持久化 (顺便说一句,“finddrity”在两个对象都已在数据库和托管数据库中时似乎工作正常) 所以问题是: 这真的是Hibernate框架的行为方式吗? FindEntry返回的“空数组”不应该阻止插入吗? 是否有其他选项可以阻止Hibernate执行插入操作 ---源代码实体类:Java 带Hibernate的JPA:新子实体未考虑findDirty-bug还是特性?,java,entity-framework,hibernate,jpa,Java,Entity Framework,Hibernate,Jpa,我们目前正面临一个新实体和findDirty拦截器的“问题”——从我们的角度看,它看起来像一个bug。然而,它也可能是一个功能-因此,对这个主题的专业知识和评论是非常感谢的 干杯 克里斯托夫 我们的环境: Hibernate 4.2.7(使用JPAAPI 2.x) 问题: 我们有两个实体UserBO和InternalOrganizationBO 两个对象之间的关系如下所示。 两个对象都有一个布尔标志“FlushUpdate”。 此“flushUpdate”标志在我们的自定义findDirty实现
@Entity
@SqlResultSetMapping(....)
@Table(schema="...", name="...")
@IdClass(UserBO_PK.class)
public class UserBO extends AbstractBO implements Serializable {
...
@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.MERGE, CascadeType.DETACH, CascadeType.PERSIST})
@JoinColumn(name=UserBO.INTERNALORGANIZATION_ID)
protected InternalOrganizationBO internalOrganization;
...
@Transient
protected boolean flushUpdates = false;
public boolean isFlushUpdates() {
return flushUpdates;
}
...
}
@Entity
@SqlResultSetMapping(
name="InternalOrganizationBO",
entities = @EntityResult(entityClass=InternalOrganizationBO.class),
columns = { @ColumnResult (name="externalName")})
@Table(schema="...", name="...")
@IdClass(InternalOrganizationBO_PK.class)
public class InternalOrganizationBO extends AbstractBO implements Serializable {
...
@OneToMany(mappedBy="internalOrganization", fetch=FetchType.LAZY, cascade={CascadeType.MERGE, CascadeType.DETACH, CascadeType.PERSIST})
protected List<UserBO> users;
...
@Transient
protected boolean flushUpdates = false;
public boolean isFlushUpdates() {
return flushUpdates;
}
...
}
---自定义impl。对于findDirty:
@Override
public int[] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
/**
* logic impl.
*/
if (entity instanceof AbstractBO) {
if (((AbstractBO) entity).isFlushUpdates()) {
return null;
} else {
logger.info("Ignoring flush for object: " + entity.getClass().getSimpleName() + ", "
+ entity.toString());
return new int[0];
}
}
}
//flush entityManager
//THIS triggers an insert of intOrg ! (no update to the User table)
entityManager.flush();
@Override
public int[] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
/**
* logic impl.
*/
if (entity instanceof AbstractBO) {
if (((AbstractBO) entity).isFlushUpdates()) {
return null;
} else {
logger.info("Ignoring flush for object: " + entity.getClass().getSimpleName() + ", "
+ entity.toString());
return new int[0];
}
}
}
//flush entityManager
//THIS triggers an insert of intOrg ! (no update to the User table)
entityManager.flush();