【问题标题】:JPA - Mapping OneToMany association between the same table using an intermediate tableJPA - 使用中间表在同一个表之间映射 OneToMany 关联
【发布时间】:2014-11-15 16:46:51
【问题描述】:

我正在创建一个应用程序,其中一个重要方面是用户能够与朋友分享内容。我试图在对象模型中表示这一点,但我无法让关联正常工作。我正在使用一个记录friender和friendee的映射表,这两者都由用户的主键(id)表示。一个用户可以有很多朋友,也可以被其他用户引用。这是架构的样子:

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 的数量错误 柱子。应该是 2

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

感谢您的帮助!

【问题讨论】:

  • 请注意:您描述的是ManyToMany,而不是OneToMany。
  • friends_map 表的定义在哪里?如果您的意思是“users_map”,那么为什么存在不属于关系的列“users_map_id”?
  • 糟糕,错字 - 这是 users_map。 “不是关系的一部分”是什么意思?它对用户之间的映射没有任何意义——应该替换/删除它吗?更改与 ManyToMany 的关系时,我也会遇到同样的错误。
  • 具有 Set 或 List(无排序)的 1-N/M-N 连接表将有 2 列,即 FK,它们将形成 PK。因此为什么没有注释来为 JPA 中的连接表定义一些人为的“id”
  • 我去掉了users_friend_id,做了一个由friender_id和friendee_id组成的复合主键,还是出现同样的错误。这是你的建议吗?

标签: java mysql hibernate jpa spring-data


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2011-06-22
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多