Обычно нельзя одновременно определить ManyToMany с JoinTable, а затем отдельно определить таблицу соединения как ее собственный объект. Соединительные таблицы обычно не являются сущностями, они просто объединяют таблицы, и поставщик управляет ими изнутри. Вы создаете много головной боли для себя, чтобы правильно поддерживать состояние памяти приложения при изменении одного или другого. (Что необходимо, если, например, вы хотите использовать кэширование L2.)
Таким образом, любой из них работает нормально, вместе взятые, они являются своего рода соусом. Обычно, если вы определили Цепь как сущность, у вас просто будет список Цепочек на Событии. Также не переопределять его как JoinTable на событие. Имеет ли это смысл?
(и, как это в настоящее время строго определено, он сломается, если вы попытаетесь внести изменения в коллекцию по событию, если только этот идентификатор не является последовательностью, созданной базой данных.)
Изменить: что-то вроде этого -
@Entity
public class Event {
@Id Integer id;
@OneToMany(cascade = CascadeType.PERSIST, mappedBy="successor")
private Collection<Chain> predecessorChains;
}
То, что вы написали изначально, можно заставить работать, если вы поймете, что Collection<Event> predecessors
по своей сути только для чтения и станет fubared, если вы попытаетесь кешировать его в L2. Тот факт, что вы положили CascadeType
, делает одну вещь, которую вы хотели бы иметь возможность добавлять и удалять События в / из этого, которая взорвется, когда hibernate попытается выполнить недопустимый SQL.