Я подозреваю, что вы можете упасть на первое препятствие:
Как было сказано ранее, Hibernate обновит объект, который вы называете update()
, и затем перейдет к любым последующим объектам, требующим обновления, в соответствии с правилами, указанными в атрибуте @Cascade
.
Проблема в том, что ваш класс User
владеет отношением, и добавление объекта User
в коллекцию VirtualDomain.userset
никак не изменяет объект User
. Таким образом, даже с каскадом Hibernate не будет обновлять объект User
, так как не считает, что должен.
Вместо этого при добавлении объекта в коллекцию VirtualDomain.userset
убедитесь, что VirtualDomain
также добавлен в коллекцию User.virtualdomainset
.
// given a VirtualDomain object
VirtualDomain domain = getSession().load( VirtualDomain.class, 1234 );
// and a User object
User user = getSession().load( User.class, 5678 );
// add the User to the VirtualDomain
domain.getUserset().add( user );
// but also add the VirtualDomain to the user
user.getVirtualdomainset().add( domain );
// update the VirtualDomain and the Cascade settings will also update the User
getSession().update( domain );
В подобных случаях я считаю полезным предоставить вспомогательный метод для добавления объектов в коллекции, а не использовать прямой доступ к самим коллекциям. например, * 1 020 *
public class VirtualDomain {
Set userset;
/* snip... */
public void addUser( User user ) {
getUserset().add( user );
user.getVirtualdomainset().add( this );
}
}
Хотя стоит помнить совет предков Hibernate:
"В реальной системе у вас может не быть связи" многие ко многим ". Наш опыт показывает, что почти всегда есть другая информация, которая должна быть прикреплена к каждой ссылке ... лучший способ ... это через промежуточный ассоциативный класс . " (Java Persistence With Hibernate, стр. 297/298, ISBN 1-932394-88-5)