2012-04-25 166 views
1

我使用hibertnate和JPA创建应用程序。我有两个班,分别是Person和Associate。由于人们拥有一个人的细节(姓名,性别等),所以这个人很自我解释。助理是一个将2个人物连接在一起的人(人与人B排成一行),有点像Facebook上的“朋友”。非常简单,一个人(A人)拥有一个同事名单,而一个同伴对象则持有另一个人(B人)被关联以及他们拥有的关系类型(朋友,家人等)。这样,人A可以知道他/她与谁相关联(即,人A知道他与人B相关联)。结构受到打击。休眠 - 删除对象引用而不删除对象

假设发生的事情是,当一个人从数据库中被删除时,他的所有关联也会被删除。这是被删除的人和与其他人的链接。问题是,当我在Person类中使用级联删除时,它会删除关联PLUS关联对象中的所有人员对象。即,如果A人和B人相关联(在相关对象中)。当人A被删除时,关联对象被删除以及人B,期望的结果是只有人A和关联对象参考人A被删除,而非人B。人B对象应该作为人留在数据库中B还没有被删除,只是2人之间的关联。我不知道该怎么做。任何想法如何我可以实现预期的结果?或者如果有更好的方法来做这个2人物的关联。


  • 结构:

Person类

@Entity

公共类Person实现Serializable {

private Long id; 
private String firstName; 
private String lastName; 
private String gender; 
@OneToMany (cascade = {CascadeType.ALL}) 
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) 
@JoinColumn(name = "person_id") 
private List<Associate> associations; 

//setters 
//getters 

}

为类 @Entity

公共类大专实现Serializable {

private Long id; 
@ManyToOne 
private Person associate; 
private String relationshipType; 
@OneToOne (cascade = {CascadeType.ALL}) 
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) 
private AssociateSettings; 

//setters 
//getters 

}

回答

0

创建只有一个实体 - 人 - 这是素描类:

@Entity 
public class Person{ 

private Long id; 
private String firstName; 
private String lastName; 
private String gender; 
@OneToMany 
private List<Person> associates; 

//setters 
//getters 
} 

每个人都可以与其他人的收集有关。不要使用级联删除,因为只需删除一个人即可轻松删除一半数据库。

+0

感谢您的回复。我想过这样做,但我也需要跟踪其他数据,如2人(朋友,家人同事等)之间的关系。因此,在清单中,每个人与清单持有者都有不同的关系。你知道我能用上面给出的结构来做到吗?我目前看不到有办法做到这一点。 – rodmen88 2012-04-26 10:16:07

+1

好吧...而不是创建一个单一的“伙伴”列表,为每个关系创建一个列表:朋友,家人,牛商人等...... – 2012-04-27 20:04:56

+1

这也可以工作。尽管我已经想出了一个解决方案。而不是将人员对象存储在员工类别中,我只会存储相关人员的ID。换句话说,我只是将Associate(在关联类中)的数据类型从Person更改为Long,并将人员的ID存储在associate属性下。这样,我不仅可以级联删除,也不会删除实际的人员,但我也可以只在需要时才能检索该人员的全部详细信息。感谢大家的帮助和投入。 – rodmen88 2012-04-30 09:53:20