2016-01-25 58 views
0

我必须处理循环依赖关系,我不能影响,我对JPA相当陌生。持续循环依赖实体

所以一个实体有相同的实体的成员,我下定决心,通过:

@Entity 
@Table("A") 
public class A { 
    @ManyToMany 
    @JoinTable(name = "A_HAS_SUBAS", 
     joinColumns = {@JoinColumn(name = "A_ID")}, 
     inverseJoinColumns = {@JoinColumn(name = "SUBA_ID")}) 
    private Set<A> as; 
} 

当写入DB我有休眠似乎并不知道其中A首先必须坚持的问题。我试图通过从A中删除所有关系,写入数据库并通过休眠恢复关系来解决此问题。

这似乎工作,但似乎失败,如果A没有SubAs,这不符合我对这个问题的理解。所以我肯定在某个地方是错的。

没有关系的实体是由内部交易持续:

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
private void immediatelySaveNewEntity(A entity) { 
    try { 
     if (!dao.entityExistsFromId((int) entity.getId())) { dao.save(entity); } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

因此,我得到一个

ORA-02291:完整性约束(...)侵犯 - 父键不发现

我可以通过从数据库中删除约束来规避此问题,但这不是我处理此问题的首选方式。

回答

0

好吧,这对我来说是一种心灵上的弯曲,但我的方法没有问题,只是有一点小小的错误。

我有循环依赖实体。在写入数据库之前,我将所有关系从实体中删除,并将其保存到数据库中,然后作为更新恢复关系。这没关系,因为通过这种方式,我拥有了数据库中的所有实体,并且可以轻松地恢复循环依赖关系。 我希望我能摆脱他们摆在首位,但没有。

错误是在如何我做到了。由于只有一个事务,关系的去除没有任何效果,因为当拥有所有关系的实体最终持久化到数据库时,我已经恢复了以前的状态。 我试图用一个新的事务与

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 

但在相同的豆,我学会了如何艰难地在同一个事务。 提示来自Strange behaviour with @Transactional(propagation=Propagation.REQUIRES_NEW)

因此,我注入了同一个bean的新实例,并在此实例上执行了新的事务,并访问了代理,并且工作良好。

0

我没有在类A中声明任何@Id属性声明。我相信你可能为了简洁而删除它。

您可以尝试更新@ManyToMany@ManyToMany(cascade=CascadeType.ALL),如下所示并尝试。

@Entity 
@Table("A") 
public class A { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "A_HAS_SUBAS", 
      joinColumns = {@JoinColumn(name = "A_ID")}, 
      inverseJoinColumns = {@JoinColumn(name = "SUBA_ID")}) 
    public Set<A> as; 
} 

能够用下面的hibernate测试代码保存它,并且应该可以使用JPA。

Session sess = //Get Session 
Transaction tx1 = sess.beginTransaction(); 

A a = new A(); 
a.as = new HashSet<>(); 
a.as.add(new A()); 
a.as.add(new A()); 
sess.persist(a); 
tx1.commit(); 

Incase我得到了你的测试场景错误,发布你的基本测试场景会有所帮助。