Включили ли вы SMTP в настройках Gmail?
Перейти в «Настройки», например, нажмите на значок «Gears» и выберите «Настройки». Нажмите на «Пересылка и POP / IMAP». Включите «Доступ по IMAP» и / или «Загрузка по протоколу POP»
Вы сделали класс пользователя владельцем отношения. Если вы хотите пойти другим путем, вам нужно переключить их сопоставление, чтобы в Domaintable был @JoinTable. Или вам нужно вручную принудительно вызвать это, используя @PrePersist или @PreUpdate в Domaintable, чтобы принудительно вызвать обновление для пользователя, которое вставит строку в таблицу соединения. Я уверен, что есть и другие способы сделать это, но на ум приходят два.
@PreUpdate example :
@EntityListeners( Domaintable.class )
@Entity
public class Domaintable
{
User user;
....
@PreUpdate
public void onPreUpdate( DomainTable domainTable )
{
if( domainTable.getUser() != null )
{
entitymanager.update( domainTable.getUser() );
}
}
....
}
Как выглядят ваши классы?
Я полагаю, у вас есть Домен класса и Пользователь класса. В классе Domain предположим, что у вас есть коллекция Users. Добавьте объект User в коллекцию Users и вызовите SaveOrUpdate для объекта Domain. Также убедитесь, что вы указали правильный параметр каскадирования (например, cascading = "save-update".
Это немного большая картина. Нам нужна более подробная информация о том, что не работает.
Я подозреваю, что вы можете столкнуться с первым препятствием:
Как было сказано ранее, Hibernate обновит объект, который вы вызываете update ()
, а затем каскадирование до любых последующих объектов, требующих обновления, в соответствии с правилами, указанными в атрибуте @Cascade
.
Проблема в том, что ваш класс User
владеет отношениями и добавляет Объект пользователя
в коллекции VirtualDomain.userset
никоим образом не изменяет объект Пользователь
. Таким образом, даже с каскадом 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 );
В подобных случаях я считаю полезным предоставить вспомогательный метод для добавления объектов в коллекции, а не чем использование прямого доступа к самим коллекциям. Например,
public class VirtualDomain {
Set userset;
/* snip... */
public void addUser( User user ) {
getUserset().add( user );
user.getVirtualdomainset().add( this );
}
}
Хотя стоит помнить совет предков Hibernate:
«В реальной системе у вас может не быть связи« многие ко многим ». Наш опыт показывает, что почти всегда есть другая информация, которая должна быть привязанным к каждой ссылке ... лучший способ ... через промежуточный класс ассоциации . " (Сохранение Java с Hibernate, стр. 297/298, ISBN 1-932394-88-5)