2009-12-02 83 views
10

我有一個用戶類。用戶可以成爲許多其他用戶的朋友。這種關係是相互的。如果A是B的朋友,那麼B是A的朋友。另外,我希望每個關係都存儲其他數據 - 例如兩個用戶成爲朋友的日期。所以這是在同一張桌子上的多對多關係,並增加了一些列。我知道應該創建一箇中產階級友誼(包含兩個用戶ID和日期欄)。但是我將這個映射到Hibernate中來。阻止我的是映射到同一個表。我可以解決它,如果多對多關係是在兩個不同的表之間。在同一張桌子上多對多地添加列

回答

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 
     } 

    } 


} 

問候,

+0

感謝您的回答。但我有一個問題。爲什麼在@ManyToOne關係中插入「insertable = false」?如果我刪除它然後它的作品。否則,MyFriends沒有正確保存。我不是Hibernate專家,所以可能我不明白。 – 2009-12-02 15:33:53

+0

好吧,我沒有使用像你這樣的EmbeddedId,而只是另一個ID列。您已將Insertable = false,因爲EmbeddedId負責處理它。你的答案被接受:) – 2009-12-02 15:41:01

+0

你已經注意到了爲什麼。當兩個屬性共享同一列時,最好將其設置放在一個屬性中。否則,Hibernate會抱怨一些錯誤。 – 2009-12-02 15:50:04

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>