Java 带Hibernate的JPA:新子实体未考虑findDirty-bug还是特性?

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实现

我们目前正面临一个新实体和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执行插入操作

---源代码实体类:

@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();