2013-05-09 161 views
1

我對Hibernate和數據庫編程一般都很老實,但是我很新穎...... 我試圖將一些類似圖形的結構保存到數據庫中。在Hibernate中將多個集合映射到一個實體中

假設我有Java類是這樣的:

public class User { 
    @OneToMany(cascade=CascadeType.ALL) 
    private Collection<User> followers = new ArrayList<>(); 
    @OneToMany(cascade=CascadeType.ALL) 
    private Collection<User> friends = new ArrayList<>(); 
    @Id 
    private String name; 
    ..... 
} 

問題是我想使用Hibernate將其保存到數據庫PostgeSQL。不過,我發現它很平凡。例如一個問題是: 假設我做的:

User user1 = new User("user1"); 
User user2 = new User("user2"); 
user1.getFollowers().add(user2); 
user1.getFriends().add(user2); 

現在,如果我不user1的對象合併會有問題與關鍵唯一性約束。我不知道是否這是問題,因爲我錯誤地配置了Hibernate註釋來保存我的結構,或者完全錯誤的方法來使用Hibernate以這種方式表示圖形?任何幫助非常感謝。

回答

0

就我個人而言,我會去生成一個ID列,並不會使用該用戶的名稱。對數據庫中的名稱列進行約束。

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column 
private long id; 

否則我看不出你的方法有什麼問題。運行代碼時是否有任何異常?

+0

當我更改ID列並刪除user_user表中的某些列的非空約束時,它似乎無任何例外地保存它。但是,仍然存在這樣的問題,即名稱應該是唯一的,並且使用不同會話中的合併重新保存同一用戶(使用相同名稱),結果會創建重複行(具有相同名稱)。我應該如何處理? – user2183977 2013-05-09 20:24:24

+0

您只需要名稱上的唯一鍵約束。您不想將其用作主鍵,否則您無法更改給定實體的名稱。 @Table(name =「users」,uniqueConstraints = { \t \t @UniqueConstraint(columnNames = {「name」})}) – Doradus 2017-09-26 11:19:01

相關問題