Я столкнулся с подобной ситуацией и решил ее самостоятельно после некоторых экспериментов. Важно помнить, что при использовании стратегии foreign
для генератора идентификаторов отношения не могут быть однонаправленными. В вашем случае вам нужно внести два изменения (см. Ниже). В основном вы установили каскадный режим для всех для AddressVO @OneToOne(cascade=CascadeType.ALL)
, и при попытке сохранить UserVO это вызовет аналогичную операцию для AddressVO. Но для AddressVO вы устанавливаете стратегию генератора идентификаторов как «чужую» со свойством userVO
. Но вы никогда не устанавливаете свойство userVO
в AddressVO, поэтому оно получает нулевой идентификатор и, следовательно, исключение. Чтобы сделать эту работу для вас необходимо внести следующие изменения
1) Добавьте свойство userVO (getter / setters) в AddressVo и перед сохранением userVo добавьте этот объект в addressVO в вашей транзакции address.setUserVo(user);
, а затем вызовите session.save(user);
2) Отредактируйте вашу схему БД, чтобы она отражала общий первичный ключ в addressVO, поскольку ограничение внешнего ключа находится в AddressVo, а не в UserVO. то есть измените следующее
alter table mediashow_user1
add index FK5FD5BCE8801495D (empid),
add constraint FK5FD5BCE8801495D
foreign key (empid)
references mediashow_address1 (empid)
до
alter table mediashow_address1
add index FK5FD5BCE8801495D (empid),
add constraint FK5FD5BCE8801495D
foreign key (empid)
references mediashow_user1 (empid)
Если вы хотите выполнить эту работу для Unidirection один-к-одному кораблю отношений, то вы должны самостоятельно выполнить каскадные операции. В основном вы должны сделать следующее
1) Удалите стратегию внешнего ключа (просто используйте аннотации @Id и @column для empId в AddressVO без какого-либо @GeneratedValue).
2) Удалите параметры каскада для AddressVo в вашем UserVO (поскольку это вызовет аналогичные операции с AddressVO, а идентификатор еще не известен)
3) Установите empId для AddressVo перед сохранением этого адреса. Вам следует использовать идентификатор, полученный при сохранении userVo.
Long id= (Long)session.save(user);
address.setEmpid(id);
session.save(address)
в основном вы должны обрабатывать операции сохранения / обновления / удаления и для адресов.
Надеюсь, это объяснение поможет:)