我有一個用戶類。用戶可以成爲許多其他用戶的朋友。這種關係是相互的。如果A是B的朋友,那麼B是A的朋友。另外,我希望每個關係都存儲其他數據 - 例如兩個用戶成爲朋友的日期。所以這是在同一張桌子上的多對多關係,並增加了一些列。我知道應該創建一箇中產階級友誼(包含兩個用戶ID和日期欄)。但是我將這個映射到Hibernate中來。阻止我的是映射到同一個表。我可以解決它,如果多對多關係是在兩個不同的表之間。在同一張桌子上多對多地添加列
10
A
回答
7
你說
許多一對多的關係在同一個表
這不是一個好主意。這是一個噩夢來維護。
試試這一個,而不是
@Entity
public class Friend {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer friendId;
@Column
private String name;
@OneToMany(mappedBy="me")
private List<MyFriends> myFriends;
}
@Entity
public class MyFriends {
@EmbeddedId
private MyFriendsId id;
@Column
private String additionalColumn;
@ManyToOne
@JoinColumn(name="ME_ID", insertable=false, updateable=false)
private Friend me;
@ManyToOne
@JoinColumn(name="MY_FRIEND_ID", insertable=false, updateable=false)
private Friend myFriend;
@Embeddable
public static class MyFriendsId implements Serializable {
@Column(name="ME_ID", nullable=false, updateable=false)
private Integer meId;
@Column(name="MY_FRIEND_ID", nullable=false, updateable=false)
private Integer myFriendId;
public boolean equals(Object o) {
if(o == null)
return false;
if(!(o instanceof MyFriendsId))
return false;
MyFriendsId other = (MyFriendsId) o;
if(!(other.getMeId().equals(getMeId()))
return false;
if(!(other.getMyFriendId().equals(getMyFriendId()))
return false;
return true;
}
public int hashcode() {
// hashcode impl
}
}
}
問候,
2
我不確定這會適合您的情況,但請試一試。
@Entity
public class Friend {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendId;
@Column
private String name;
@ManyToMany(mappedBy="owner")
private List<Friendship> friendships;
}
@Entity
public class Friendship {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendshipId;
@OneToOne
private Friend owner;
@OneToOne
private Friend target;
// other info
}
1
我有同樣的問題。你可以嘗試這樣的事情:
<class name="Friend" entity-name="RelatedFriend" table="FRIENDS">
<id name="id" type="long">
<generator class="native" />
</id>
<!-- *** -->
<set name="relatedFriends" table="RELATED_FRIENDS">
<key column="FRIEND_ID" />
<many-to-many column="RELATED_FRIEND_ID" class="Friend" entity-name="RelatedFriend"/>
</set>
</class>
相關問題
- 1. 在同一張桌子上的多對多關係
- 2. 一對多加入同一張桌子上的3個級別
- 3. 一張桌子內多對多
- 4. 多張桌子與同一張桌子有關係
- 5. 多個選擇在一張桌子上
- 6. 左外加在同一張桌子上
- 7. linq加入多張桌子
- 8. 多個選擇與聚合在同一張桌子上
- 9. Rails:在同一張桌子上運行的多個模型
- 10. MYSQL在同一張桌面上加入多次
- 11. ManyToMany在同一張桌子上
- 12. FK在同一張桌子上
- 13. 在同一張桌子上合併2個不同的地方
- 14. 如何在同一張兩張桌子之間做多個多對多的關係
- 15. Laravel同一張桌子之間的一對多和一對一關係
- 16. 多個在同一張表上加入不同列
- 17. 同一張桌子上的INNER JOIN COUNT
- 18. mysql加入2張桌子 - 但必須加入同一張桌子兩次
- 19. 許多對一張桌子,在laravel的關係
- 20. 什麼更好 - 許多小桌子或一張大桌子?
- 21. 學說一張桌子到很多桌子和紀錄
- 22. 多張桌子還是一個大桌子?
- 23. 在同一張桌面上計算多個連接
- 24. 我如何將一張桌子與許多不同的桌子聯繫起來?
- 25. 通過在同一張桌子上使用多個連接更新表格
- 26. 我想在同一張桌子上創建更多的觸發器
- 27. SQL從一張桌子和另一張桌子上的一個桌子加入一切?
- 28. 參考一張桌子或另一張桌子的桌子排
- 29. 如何與Laravel 5中的同一張桌子建立一對多的關係?
- 30. Grails在同一張表上的多對多關係
感謝您的回答。但我有一個問題。爲什麼在@ManyToOne關係中插入「insertable = false」?如果我刪除它然後它的作品。否則,MyFriends沒有正確保存。我不是Hibernate專家,所以可能我不明白。 – 2009-12-02 15:33:53
好吧,我沒有使用像你這樣的EmbeddedId,而只是另一個ID列。您已將Insertable = false,因爲EmbeddedId負責處理它。你的答案被接受:) – 2009-12-02 15:41:01
你已經注意到了爲什麼。當兩個屬性共享同一列時,最好將其設置放在一個屬性中。否則,Hibernate會抱怨一些錯誤。 – 2009-12-02 15:50:04