Как я могу вставить запись в объединяющую таблицу, многие многим в спящем режиме аннотация?

Включили ли вы SMTP в настройках Gmail?

Перейти в «Настройки», например, нажмите на значок «Gears» и выберите «Настройки». Нажмите на «Пересылка и POP / IMAP». Включите «Доступ по IMAP» и / или «Загрузка по протоколу POP»

5
задан Jason Plank 18 November 2011 в 01:56
поделиться

3 ответа

Вы сделали класс пользователя владельцем отношения. Если вы хотите пойти другим путем, вам нужно переключить их сопоставление, чтобы в 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() );
    }
}

....

}
0
ответ дан 14 December 2019 в 01:16
поделиться

Как выглядят ваши классы?

Я полагаю, у вас есть Домен класса и Пользователь класса. В классе Domain предположим, что у вас есть коллекция Users. Добавьте объект User в коллекцию Users и вызовите SaveOrUpdate для объекта Domain. Также убедитесь, что вы указали правильный параметр каскадирования (например, cascading = "save-update".

Это немного большая картина. Нам нужна более подробная информация о том, что не работает.

0
ответ дан 14 December 2019 в 01:16
поделиться

Я подозреваю, что вы можете столкнуться с первым препятствием:

Как было сказано ранее, 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)

9
ответ дан 14 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: