Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate中具有附加列的自引用实体_Hibernate_Attributes_Many To Many_Self Reference_Self Referencing Table - Fatal编程技术网

Hibernate中具有附加列的自引用实体

Hibernate中具有附加列的自引用实体,hibernate,attributes,many-to-many,self-reference,self-referencing-table,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

我想用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;
@ManyToMany Set<Friendship> friendships;
因为这样我就无法重定向用户的友谊,因为我无法添加类似的内容

@OneToMany Set<Friendship> friendships; 
@OneToMany建立友谊;
因为我无法指定mappedBy=?参数,因此该关系将映射到另一个表中

但我想保持双向性

这个问题有什么好的解决办法吗

此外,用户在友谊表中的顺序并不重要,因此(user1,user2)=(user2,user1)。我认为这最好用一个idClass/EmbeddedId和一个等价的equals()实现来表示,对吗

编辑: 如果你在两个元素上定义了一些顺序,比如fromto,ownerowned,那么这似乎是可能的,但我看不到这种关系中有任何自然顺序,我不想仅仅为了这个技术问题定义一些人为的东西…

用户实体

@ManyToMany Set<Friendship> friendships;
@ManyToMany Set<Friendship> friendships;
或者,如果希望友谊实体具有主键(user1、user2),则该实体必须拆分为2个表,如下所示:

FriendFK fKey;
Date firstMeeting;
表fk:

User member;
User memberFriend;

这将导致3个表:1)友谊2)用户3)友谊用户(见问题)此外,你不需要创建额外的实体来创建复合pk。还有其他方法可以实现这一点(IdClass或EmbeddedId)。
User member;
User memberFriend;