关于JPA onetomany联合表

时间:2011-12-05 21:54:28

标签: hibernate jpa

我有两个实体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”。我没有在联合表上设置任何约束,所以我没有这个约束的来源。任何人都可以帮我删除这个约束。非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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