0

我想這些表與Hibernate映射:自參照實體在休眠與其他列

CREATE TABLE user 
(
    id VARCHAR(20), 
    //some stuff  
    PRIMARY KEY(id) 


); 

CREATE TABLE friendship 
(
    user1 VARCHAR(20), 
    user2 VARCHAR(20), 
    firstMeeting TIMESTAMP, 
    //mb some additional stuff 
    PRIMARY KEY(user1, user2), 
    FOREIGN KEY(user1) REFERENCES user(id), 
    FOREIGN KEY(user2) REFERENCES user(id) 
); 

我想知道映射的正確方法。我想到了這一點:

用戶實體

@ManyToMany Set<Friendship> friendships; 

友誼entitiy與

@Size(min=2, max=2) 
@ManyToMany Set<User> members; 

Date firstMeeting; 

,但我不覺得這上面(不僅在列名,但在TBL計數的模式匹配,模式需要2個,但是這需要3個映射表,2個實體和1個ManyToMany關係映射表)。 的problm是我不能映射此爲2倍

@ManyToOne User user1/2; 

因爲那時我將無法到友誼從用戶重定向,因爲我不能像

@OneToMany Set<Friendship> friendships; 

添加一些用戶,因爲我不會是能夠指定mappedBy =?論點,所以這種關係將被映射到一個附加表中...

但是我想保持雙向。

這個問題的任何好的解決方案?

除此之外,用戶在友誼表中的排序並不重要,所以(user1,user2)=(user2,user1)。我認爲這將是一個idClass/EmbeddedId與等效equals()的最佳表示 - 實現,對吧?

編輯: 這似乎是可能的archieve此,如果u超過2個元素定義一些命令,就像從< - >到,業主< - >所有,但我沒有看到與此相關的任何自然秩序和我不RLY要定義一些人爲的東西只是這個技術問題......

回答

0

用戶實體

@ManyToMany Set<Friendship> friendships; 

,然後友誼表:

User member; 
User memberFriend; 
Date firstMeeting; 

或者如果你想與PRIMARY KEY(用戶1,用戶2),實體必須被分割爲2臺像友誼entitiy:

FriendFK fKey; 
Date firstMeeting; 

和表FriendFK:

User member; 
User memberFriend; 
+0

這將導致3個表: 1)友誼 2)用戶 3)friendship_user (查看問題) – scrimau

+0

除了你不需要創建一個額外的實體來創建一個複合pk。還有其他方法可以實現這一點(IdClass或EmbeddedId)。 – scrimau