Hibernate 关于JPA onetomany关节表

Hibernate 关于JPA onetomany关节表,hibernate,jpa,Hibernate,Jpa,我有两个实体用户和事件。每个用户都有一个他喜欢的事件列表。因此,我建立了一个OneToMany地图,如下所示: @Entity @Table(name = "user") public class User { @Id @Column(name = "login", length = 64) protected String login; @OneToMany(cascade = CascadeType.ALL) @LazyCollection(Lazy

我有两个实体用户和事件。每个用户都有一个他喜欢的事件列表。因此,我建立了一个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;
}
@实体
@表(name=“user”)
公共类用户{
@身份证
@列(name=“login”,长度=64)
受保护的字符串登录;
@OneToMany(级联=级联类型.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name=“user\u事件”,
joinColumns={@JoinColumn(name=“login”)},
inverseJoinColumns={@JoinColumn(name=“event_id”)})
受保护列表事件;
}
@实体
@表(name=“events”)
公共类事件扩展BaseEntity{
@身份证
@列(name=“event\u id”)
@GeneratedValue(策略=GenerationType.IDENTITY)
受保护的长事件ID;
@列(name=“title”,长度=200)
受保护的字符串标题;
}

现在我有两个用户,首先我将一个用户设置为一个事件,并正确更新数据库中的关节表。然后我让另一个用户喜欢相同的事件,但是这次有一个错误,说重复的键值违反了唯一的约束“user\u events\u event\u id\u key”。我没有在关节表上设置任何约束,因此我不知道该约束来自何处。有人能帮我消除这个限制吗。非常感谢。

当Hibernate为您生成模式时,约束可能是由它自己设置的。由于您将关联指定为OneToMany,因此假定只有一个用户喜欢给定的事件。Hibernate通过在联接表的event_id列上设置唯一约束来保证这一点


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

一个简单的问题:@ManyToOne如何?在某些地方会有约束吗?很多通是在多个端使用外键实现的,外键指向一侧的PK。这里不需要唯一的约束。