Java JPA-使用中间表在同一个表之间映射一个域的关联
我正在创建一个应用程序,其中一个重要方面是用户能够与朋友共享内容。我正试图在对象模型中表示这一点,但我很难让关联正常工作。我正在使用一个映射表来记录friender和friendee,这两个表都由用户的主键(id)表示。一个用户可以有很多朋友,也可以被其他用户引用。这是架构的外观:Java JPA-使用中间表在同一个表之间映射一个域的关联,java,mysql,hibernate,jpa,spring-data,Java,Mysql,Hibernate,Jpa,Spring Data,我正在创建一个应用程序,其中一个重要方面是用户能够与朋友共享内容。我正试图在对象模型中表示这一点,但我很难让关联正常工作。我正在使用一个映射表来记录friender和friendee,这两个表都由用户的主键(id)表示。一个用户可以有很多朋友,也可以被其他用户引用。这是架构的外观: Users: int user_id (PK) varchar(32) email varchar(64) password Users_Map: int users_map_id (PK) int friende
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;
}
@数据
@实体
@表(name=“users”)
公共类用户扩展了可抽象持久化{
@身份证
@列(name=“user\u id”)
私人长id;
@纵队
私人字符串电子邮件;
@纵队
私有字符串密码;
@独身癖
@JoinTable(name=“users\u map”,
joinColumns={@JoinColumn(name=“friender_id”)},
inverseJoinColumns={@JoinColumn(name=“Friendeee_id”)})
私人名单朋友;
}
部署应用程序时,我遇到以下错误:
org.hibernate.AnnotationException:外键引用
com.x.webapp.data.entity.User from
com.x.webapp.data.entity.User拥有错误的
专栏。应该是2
我尝试了很多其他配置,包括为每个@JoinColumn添加“referencedColumnName”属性,但它们也产生了错误。我也不完全确定当前的模式是否是将用户映射到一起的最佳方式
谢谢你的帮助 删除AbstractPersistable的扩展修复了这个问题-它包含了一个@Id引用,并且与我在用户中放置的@Id引用冲突。只是一个注意:您描述的是一个多个,而不是一个多个。“friends\u map”表的定义在哪里?如果你的意思是“用户地图”,那么为什么有一列“用户地图id”不是关系的一部分呢?哎呀,什么是打字错误?它是用户地图。你说的“不属于关系”是什么意思?它对用户之间的映射没有意义-是否应该替换/删除它?在将关系更改为ManyToMany时,我也会遇到同样的错误。带有Set或List(无顺序)的1-N/M-N联接表将有两列,即FKs,它们将构成PK。因此,为什么在JPAI中没有为连接表定义人工“id”的注释?丢弃了用户的friend id,并生成了一个由friender_id和Friendeee_id组成的复合主键,同样的错误仍然发生。这是你的建议吗?