2013-10-15 3 views
0

я использую апатридов транзакционных услуг (смысл, я открываю новую сессию и транзакцию для каждого вызова), как это:Повторное прикрепление и манипулируя отдельностоящий экземпляр в Hibernate (JPA)

@Transactional 
void someService(Object o) { 
    Object newO = entityManager.merge(o); 
    newO.getChildren().add(something); 
} 

объекта О, который я прохожу к услуга - отдельный объект. Проблема с merge(object) заключается в том, что он возвращает новый экземпляр, чтобы манипулировать, вместо того чтобы сделать сам аргумент постоянным. Поэтому любые изменения, которые я делаю на постоянном объекте, не происходят с исходным объектом в памяти.

Я мог бы, конечно, переписать все мои местные ссылки, но я надеюсь, что есть лучшее решение.

Есть ли способ сделать мой локальный экземпляр управляемым, вместо получения нового экземпляра?

Я пробовал refresh(object) и update(object), но у меня есть исключения, потому что ассоциации объекта все еще отсоединены.

Когда я комментирую ассоциации с @Cascade(value=CascadeType.save-update), он отлично работает, но не вызывает проблем с производительностью, когда у меня много ассоциаций OneToMany или ManyToMany?

ответ

1

Я думаю, вы можете просто использовать отсоединенный Object o и после просто использовать session.update(o).

Постарайтесь посмотреть this video tutorial, может быть, это будет полезно!

Ciao!

+0

+1 thx для ссылки. по какой-то причине это не работает должным образом для меня, хотя. Я просмотрю и опубликую, как только я дойду до конца. –

+0

Я понял. Я должен был упомянуть, что я манипулирую ассоциациями, когда объект отсоединен. все манипулируемые ассоциации, похоже, нуждаются в каскаде = обновление обновления-обновления или он жалуется, что они не подключены во время вызова обновления. –

+0

Хорошо! Полезно знать! – Paolo

0

Вы можете использовать способ find(entityClass, primaryKey) для загрузки вашего объекта. Просто укажите первичный ключ и значения класса сущности, и он возвращает живой объект из БД.

Теперь внесите изменения в этот объект и любые изменения, внесенные в этот живой объект, будут отображены назад, а спящий режим обновит базу данных соответствующим образом. Я лично столкнулся с такой ситуацией, и это сработало для меня.

+0

У меня есть локальный объект в памяти, который отсоединен. Как мне настроить этот локальный экземпляр? find() вернет мне новый экземпляр. –

+0

После выполнения изменений вы можете 'persist()' этот объект и изменения будут отражены. – SudoRahul

+0

Вы имеете в виду обновление() Я думаю, –

Смежные вопросы