Ответ 1
Ваш первый пример - это нормальное и правильное двунаправленное сопоставление "один-ко-многим" / "много-к-одному". Установка Question
в Choice
-attribute ( "сторона владения" ) достаточно, чтобы отношения сохранялись. График сущности в памяти будет испорчен до тех пор, пока другая сторона отношения не будет снова прочитана из базы данных. Из
владелец точки базы данных базы данных - это объект, который хранится в таблице, имеющей столбец внешнего ключа (тот же для двунаправленного взаимно однозначного). В спецификации это объясняется следующим образом:
Многие стороны двунаправленных отношений "один-ко-многим/много-к-одному" должна быть собственная сторона, поэтому элемент mappedBy не может быть указанная в аннотации ManyToOne.
....
Двунаправленный отношения между управляемыми объектами будут сохраняться на основе ссылки, которыми владеет владеющая сторона отношений. Это разработчики несут ответственность за сохранение в памяти ссылок, хранящихся на владеющая сторона и те, которые находятся на обратной стороне, согласуются с друг друга, когда они меняются. В случае однонаправленного одностороннего и отношения "один ко многим", ответственность разработчиков лежит на убедитесь, что семантика отношений соблюдается.
В терминах JPA ваш второй пример не имеет собственной стороны из-за отсутствия mappedBy
. Вместо этого у вас есть два однонаправленных отношения, которые вынуждены использовать тот же столбец, что и хранилище. По крайней мере, с Hibernate 3.5.6 он будет вести себя следующим образом:
- Установка
Question
вChoice
-атрибут не будет сохраняться. - Добавление
Choice
вQuestion
-трибут не будет сохраняться. - Чтобы сохранить значение
"QUESTION_ID"
, оба параметра должны быть установлены (да, также не -insertable
Question
).