2013-07-10 1 views
0

У меня есть процесс, когда пользователь может создать объект (назовем его A) и манипулировать им в несколько этапов. Пользователь также может добавить ссылку на объект с сохранением объекта (назовем постоянный объект B). Я не хочу сохранять A в базе данных, если последний шаг не закончен, поэтому я кэширую его после каждого шага.Повторное прикрепление отдельных объектов в Playframework

Я использую Playframework с Java и JPA, и поэтому B получает отдельностоящий как только извлечь его из базы данных, присвоить его и кэш А. После подачи последнего шага, мне нужно иметь переходный объект B снова, чтобы сохранить его.

Вот Exception

[PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: models.B] 

Что является лучшим способом для архивирования что?

Заранее спасибо

ответ

0

Я немного озадачена ваш вопрос. Объекты Entity будут только в состоянии отсоединения, если они когда-либо управлялись контекстом постоянства (например: они когда-либо были сохранены/обновлены/извлечены из базы данных) или вы создали новый объект сущности и задали его поле первичного ключа. До тех пор ваши сущности всегда преходящи. Поэтому, глядя на ваше требование, почему бы не сохранить все преходящее (например: сохранить его в сеансе http) до последнего шага и сохранить все?

На стороне примечания, если я не ошибаюсь, разница между отключенным и переходным является полем первичного ключа. Поэтому, если у вас есть отдельный объект и вы сбросите поле первичного ключа по умолчанию (0 или null), вы можете сказать, что это временная сущность. Под капотом может быть, есть некоторые объектные проксите оставшийся на отдельное лицо, а не на временном, но я думаю, что это не должно влиять на поведение:

// start transaction A.. 
User u1 = new User("Sam"); // u1 is transient 
em.persist(u1);    // u1 is managed, say database gives us id 1 
// commit and end transaction A.. 
em.detach(u1);    // u1 is detached 

// start transaction B.. 
User u2 = new User("Sammy");// u2 is transient 
u2.setId(1);    // u2 can be treated as detached object of u1 because it has same id 
em.merge(u2);    // this should updates the user row with id 1 name from 'Sam' into 'Sammy' 
// commit and end transaction B 
+0

Спасибо gerrytan. I thnk моя проблема в том, что переходный объект, который я пытаюсь сохранить, имеет постоянный объект как атрибут. Поэтому, как только я кэширую основной объект, атрибут объектов кажется отсоединенным. по крайней мере, это то, что «org.hibernate.PersistentObjectException: отдельный объект, переданный для сохранения: models.B' говорит мне –

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