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 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);
答案 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 .......