О JPA onetomany совместный стол - PullRequest
       0

О JPA onetomany совместный стол

3 голосов
/ 06 декабря 2011

У меня есть две сущности: Пользователь и Событие. У каждого пользователя есть список событий, которые ему нравятся. Поэтому я настроил карту 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 голосов
/ 06 декабря 2011

Ограничение, вероятно, было установлено самим Hibernate, когда он генерировал схему для вас. Так как вы указали связь как OneToMany, только одному пользователю должно понравиться данное событие. Hibernate делает это гарантированным, устанавливая уникальное ограничение на столбец event_id таблицы соединения.

Ваша ассоциация должна быть ManyToMany, и вы не должны использовать CascadeType.ALL, поскольку она удалит все события, которые понравятся пользователю, когда этот пользователь будет удален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...