Подтвердить что ты не робот

Двунаправленный "один-ко-многим" с возможностью соединения

У меня возникают некоторые проблемы, получающие двунаправленную ассоциацию "один ко многим", работающую с JoinTables. Это то, что я получил:

Класс A:

@OneToMany
@JoinTable(name="join_table", 
    JoinColumns={@JoinColumn(name="a_id")},
    inverseJoinColumns={@JoinColumn(name="b_id")}
)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
public Set<B> getBs() {
    return bs;
}

Класс B:

@ManyToOne
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="b_id", insertable=false,updatable=false)},
    inverseJoinColumns={@JoinColumn(name="a_id", insertable=false,updatable=false)})
public A getA() {
    return a;
}

Если я создам экземпляр A и B, добавьте экземпляр B в и сохраните. Оно работает. Но когда я перезагружаю экземпляр A и пытаюсь получить доступ к набору Bs, он бросает LazyInitializationError с сообщением "незаконный доступ к загрузке коллекции".

Где я здесь ошибаюсь?:) Может ли кто-нибудь указать мне пример двунаправленной ассоциации, которая использует таблицу соединений. И где собственность хранится в классе A, я искал документацию на hibernate.org, но я не могу ее найти.

-Daniel

4b9b3361

Ответ 1

Ваше сопоставление является правильным и поэтому запись сохраняется в базе данных. Проблема при извлечении из-за Lazy Initialization.

Чтобы решить эту проблему, измените отображение класса A as,

@OneToMany(fetch=FetchType.LAZY)
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="a_id")},
    inverseJoinColumns={@JoinColumn(name="b_id")}
)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
public Set<B> getBs() {
    return bs;
} 

Это вызовет дополнительный запрос к таблице B и инициализирует коллекцию. Это может повлиять на производительность в зависимости от отсутствия записей в таблице вашего ответчика.

Прочтите API здесь для получения дополнительной информации.