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