Господа, есть проблема с хибернейтом.
Есть unidirectional
@OneToMany с каскадом all.
И есть отдельное вам к этой вложенной энтити с возможностью записи fk напрямую, через dto.
Если я пишу
@OneToMany с mappedBy, то хибер не пишет fk, и вроде как не должен. Везде пишут, что нужен не mappedBy, который вообще для bidirectional, а
@JoinColumn. Но
@JoinColumn нельзя на поле, которое уже определено через
@Column в дочерней энтити. Только если insertable и updatable false сделать.
Но тогда перестает работать апи на работу с этой энтити отдельно.
Кажется, что разработчики хибера хотели запретить то, что я хочу сделать.
Можно ли это реализовать без костылей?
Если нет, то какой костыль лучше?
советую заглянуть сюда
https://www.amazon.com/Java-Persistence-Hibernate-Christian-Bauer/dp/1617290459половина этой книжки про самые разные способы маппингов(и не только) попробуй там поискать маппинг который тебе нужен
я не гуру гибернейта но кое какие шишки набил
в общем как мне кажется чтобы пазл сложился тебе нужно прочитать про:
1) маппинг твоей связи
2) жизненный цикл ентити и события
3) как каскадятся события
4) что такое овнер связи
5) что такое entityManager.getReference
вот моя версия почему не сохраняется pk
- овнер связи - потомок
- ты скорее всего для проверки создаёшь родителя и хочешь сразу привязать потомка который уже есть в базе
- хибер делает persist родителя
- persist каскадится на потомка который находится в состоянии managed или detached (что в таком случае произойдёт - хз, я думаю ничего), но тебе нужно обновить потомка, а для этого над ним нужно отдельно сделать merge после persist'a родителя
в общем если я угадал, попробуй убрать каскад, сделать persist родителя а потом merge потомка