hibernate - 关于JPA onetomany联接表

标签 hibernate jpa

我有两个实体“用户”和“事件”。每个用户都有一个他喜欢的事件列表。所以我设置了一个 OneToMany 映射,如下所示:

@Entity
@Table(name = "user")
public class User {
    @Id
    @Column(name = "login", length = 64)
    protected String login;

    @OneToMany(cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    @JoinTable(name = "user_events",
        joinColumns = {@JoinColumn(name = "login")},
        inverseJoinColumns = {@JoinColumn(name = "event_id")})
    protected List<Event> events;
}

@Entity
@Table(name = "events")
public class Event extends BaseEntity{
    @Id
    @Column(name = "event_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long eventId;

    @Column(name = "title", length = 200)
    protected String title;
}

现在我有两个用户,首先我让一个用户喜欢一个事件,并且数据库中的联合表正确更新。然后我让另一个用户喜欢相同的事件,但是这次出现错误,指出重复的键值违反了唯一约束“user_events_event_id_key”。我没有在联合表上设置任何约束,所以我不知道这个约束来自哪里。谁能帮我消除这个限制。非常感谢。

最佳答案

该约束可能是由 Hibernate 本身在为您生成架构时设置的。由于您将关联指定为 OneToMany,因此应该只有一个用户喜欢给定的事件。 Hibernate 通过在连接表的 event_id 列上设置唯一约束来保证这一点。

您的关联应该是ManyToMany,并且您不应该使用CascadeType.ALL,因为当用户被删除时,它会删除该用户喜欢的所有事件。

关于hibernate - 关于JPA onetomany联接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392416/

相关文章:

jpa - 查询外键列的最佳方法是什么?

java - Spring中如何将表单映射到实体

java - 如何从jpa原生查询的resultList中获取clob值?

java - 用于 WITH 子句和 FROM 子句中的子查询的 JPA Criteria API

java - 简单的 hibernate 查询返回非常慢

java - JPA 多实体与集合查询

java - 如何避免在 JPA Hibernate 一对多中更新父级

mysql - serverError :class javax. faces.el.E​​valuationException 无法执行查询

hibernate - 如何在多项目 Maven 中配置 Log4j

java - 使用 Hibernate POJO 的 SQL 外键错误