使用其他列自我引用Hibernate中的实体

时间:2013-06-29 00:22:07

标签: hibernate attributes many-to-many self-reference self-referencing-table

我想用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;

友谊与

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

Date firstMeeting;

但我不认为这与上面的模式匹配(不仅在列名中,而且在tbl计数中,模式需要2但这需要3个表映射到,2个实体和1个用于ManyToMany关系映射表)。 问题是我不能将其映射为2次

@ManyToOne User user1/2;

因为那时我无法重定向用户的友谊,因为我无法添加类似

的内容
@OneToMany Set<Friendship> friendships; 

到用户,因为我无法指定mappedBy =?参数,所以关系将映射到另一个表...

但我想保持双向。

这个问题有什么好的解决方案吗?

除了在友谊表中如何订购用户无关紧要外,所以(user1,user2)=(user2,user1)。我认为这最好用idClass / EmbeddedId表示,等效的是equals() - 实现,对吗?

编辑: 似乎有可能实现这一点,如果你在2个元素上定义一些顺序,比如从&lt; - &gt;到所有者&lt; - &gt;拥有,但我没有看到这种关系中的任何自然顺序,我不想要为这个技术问题定义一些人为的东西...

1 个答案:

答案 0 :(得分:0)

用户实体

@ManyToMany Set<Friendship> friendships;

然后是友谊表:

User member;
User memberFriend;
Date firstMeeting;

或者如果您想要使用PRIMARY KEY(user1,user2)进行友谊授权,则必须将实体拆分为2个表格,如:

FriendFK fKey;
Date firstMeeting;

和表FriendFK:

User member;
User memberFriend;