В спецификации JPA явно не сказано, как обрабатывать набор столбцов, представляющих встраиваемый объект, которые все пусты. Он может сигнализировать нулевую ссылку или экземпляр объекта со всеми пустыми полями. В этом случае Hibernate выбирает нулевую ссылку, хотя другие реализации JPA могут выбрать более позднюю.
Причина, по которой ваш сеттер никогда не вызывается, заключается в том, что Hibernate обращается к вашему полю с помощью отражения, минуя реализованный вами сеттер. Это происходит потому, что вы используете доступ на основе полей, а не доступ на основе свойств.
Ответ Чада обеспечит требуемую функциональность, но есть оговорка (см. Ниже).
"... Постоянное состояние объекта
доступ по настойчивости
время выполнения провайдера [1] либо через
Средства доступа к свойствам в стиле JavaBeans или
через переменные экземпляра. Один
тип доступа (доступ к полю или свойству)
применяется к иерархии объектов. когда
аннотации используются, размещение
аннотации сопоставления либо на
постоянные поля или постоянные
свойства класса сущности
указывает тип доступа как
доступ на основе поля или свойства
соответственно ... "[ejb3 упорство
спецификация]
поэтому, перемещая аннотации вниз к установщику, вы сообщаете JPA, что хотите использовать доступ на основе свойств вместо доступа на основе полей. Однако вы должны знать, что доступ на основе полей - в том виде, в котором вы в настоящее время его реализуете, - предпочтительнее доступа на основе свойств. Есть несколько причин, по которым доступ на основе свойств не рекомендуется, но одна из них заключается в том, что они вынуждены добавлять методы получения и установки для всех ваших постоянных полей сущностей, но вы можете не захотеть, чтобы эти же поля были подвержены мутациям со стороны внешних клиентов. Другими словами, использование доступа на основе свойств JPA вынуждает вас ослабить инкапсуляцию вашей сущности.