我有两个实体User和Event。每个用户都有他喜欢的事件列表。所以我设置了一个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”。我没有在联合表上设置任何约束,所以我没有这个约束的来源。任何人都可以帮我删除这个约束。非常感谢。
答案 0 :(得分:0)
约束可能是由Hibernate本身设置的,当它为你生成架构时。由于您将关联指定为OneToMany,因此只有一个用户应该喜欢给定的事件。 Hibernate通过在连接表的event_id列上设置唯一约束来保证它。
您的关联应该是ManyToMany,并且您不应该使用CascadeType.ALL,因为它会删除用户在删除此用户时所喜欢的所有事件。