2014-09-21 41 views
0

我正在创建一个应用程序,其中一个大方面是用户与朋友共享内容的能力。我试图在对象模型中表示这一点,并且无法使关联正常工作。我正在使用一个映射表来记录friender和friendee,这两者都由用户的主键(id)表示。用户可以有很多朋友,也可以被其他用户引用。这是该架构是什么样子:JPA - 使用中间表在同一张表之间映射OneToMany关联

Users: 
int user_id (PK) 
varchar(32) email 
varchar(64) password 

Users_Map: 
int users_map_id (PK) 
int friendee_id (FK references users(user_id)) 
int friender_id (FK references users(user_id)) 

这就是我如何在用户实体设置:

@Data 
@Entity 
@Table(name = "users") 
public class User extends AbstractPersistable<Long> { 

    @Id 
    @Column(name = "user_id") 
    private Long id; 

    @Column 
    private String email; 

    @Column 
    private String password; 

    @OneToMany 
    @JoinTable(name = "users_map", 
      joinColumns = { @JoinColumn(name = "friender_id") }, 
      inverseJoinColumns = { @JoinColumn(name = "friendee_id") }) 
    private List<User> friends; 
} 

我部署应用程序时遇到以下错误

org.hibernate.AnnotationException:外键引用 com.x.webapp.data.entity.User从 com.x.webapp.data.entity.User的错误编号为 c olumn。应该是2

我已经尝试了很多其他配置,包括为每个@JoinColumn添加“referencedColumnName”属性,但它们也产生了错误。我也不完全确定我现在拥有的模式是否是将用户映射到一起的最佳方式。

我感谢任何帮助!

+2

只是一个说明:你描述的是一个ManyToMany,而不是OneToMany。 – 2014-09-21 17:29:04

+0

“friends_map”表的定义在哪里?如果你的意思是“users_map”那么为什么有一列不是关系的一部分的“users_map_id”? – 2014-09-21 17:29:38

+0

糟糕,什么是错字 - 它是users_map。 “不是关系的一部分”是什么意思?它对用户之间的映射没有意义 - 是否应该被替换/删除?将关系更改为ManyToMany时,我也会遇到同样的错误。 – Swamp56 2014-09-21 17:40:57

回答

0

删除AbstractPersistable的扩展可以解决这个问题 - 它包含一个@Id引用,并与我放入User的@Id引用发生冲突。