JPA:在bean MERGE CASCADE和beforeTransactionCompletion期间插入两次:因此SQLIntegrityConstraintViolationException

时间:2017-09-19 11:48:56

标签: java hibernate jpa

INSERT发生两次,因此错误java.sql.SQLIntegrityConstraintViolationException

我不明白的是,一旦CASCADE发生并且使用实体信息创建/更新了DB,为什么再次发现实体为DIRTY,并且在beforeTransaction完成的flush / cascade期间再次在DB上调用INSERT / UPDATE。

有谁可以帮助我。 我尝试了所有可能的方法使它工作,但无法成功。  请帮帮我。

数据模型:

实体定义:

@Entity
@Table
public class RDBMSRoleBean {

    @OneToMany(mappedBy = "assocRole", cascade = CascadeType.ALL, orphanRemoval = true)
    private Collection<RoleResourcePermBean> resourceAssociations = new ArrayList<RoleResourcePermBean>();

}


@Entity
public class RoleResourcePermBean {

    @ManyToOne
    @JoinColumn(name = "ROLE", insertable = false, updatable = false)
    private RDBMSRoleBean assocRole;

    @ManyToOne
    @JoinColumn(name = "RESOURCE_ID", insertable = false, updatable = false)
    private ResourcePermBean associatedResource;
}

@Entity
public class ResourcePermBean {

    @OneToMany(mappedBy = "associatedResource", cascade = CascadeType.ALL, orphanRemoval = true)
    private Collection<RoleResourcePermBean> roleResourcePermLocal = new ArrayList<RoleResourcePermBean>();
}

创建RoleResourcePermBean:

RoleResourcePermBean bean = new RoleResourcePermBean(role.getRoleId(),
                            new Integer((int) permissions[i]), authorized);
                    bean.setAssocRole(role);
                    role.getResourceAssociations().add(bean);

                    permBean = findByPrimaryKey(ResourcePermBean.class, new Integer((int) permissions[i]));
                    bean.setAssociatedResource(permBean);
                    permBean.getRoleResourcePermLocal().add(bean);

1 个答案:

答案 0 :(得分:0)

可能是因为我有2个EntityManager实例。 实际上我正在为所有JPA Entity bean使用SessionBeans for facade。 我得到了会话Bean中的代码来实例化EntityManager,但是实体管理器如何对象&#39; em&#39;没有初始化(不确定什么是错的)。因此,我得到了下面的代码片段来从EntityManagerFactory创建对象。我正在使用Util Class来获得相同的东西,但不知何故得到了2个实体对象。 现在我修复了问题,就像创建实体管理器对象一样,我设置相同的util类,以便在整个会话中只存在一个实体管理器对象。 :

@PersistenceContext(unitName =&#34; PFJPAEMJTA&#34;)     私有EntityManager em;

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(&#34; PFJPAEMJTA&#34;);                     em1 = em = entityManagerFactory.createEntityManager();

的persistence.xml:

        org.hibernate.jpa.HibernatePersistenceProvider .......