2008-11-12 2 views
3

Я работаю с hibernate/JPA на JBoss в течение нескольких месяцев и имею один вопрос, на который я не могу найти ответ или решение.Сохранение с использованием hibernate/JPA

Похоже, при создании новых бобов сущности я не в состоянии сделать запрос, прежде чем я по крайней мере, под названием EntityManager.persist (EntityBean), либо я получаю следующее сообщение об ошибке:

TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

пример:

Job job = new Job(); 
Collection<Task> tasks = job.getTasks(); 
//entityManager.persist(job); 
ActionPlan actionPlan = (ActionPlan) entityManager.createNamedQuery("ActionPlan.findByCommand"). 
       setParameter("type", RunOperation.Install).getSingleResult(); 
Task task = Task.getTask(actionPlan); 
task.setActionPlan(actionPlan); 
tasks.add(task); 
task.setJob(job); 

Моя проблема заключается в том, что я не могу назвать createNamedQuery без первого сохраняющихся «работа» (линия, которая закомментирована). ActionPlan имеет отношение к Job, но NamedQuery (findByCommand) не присоединяется к Job. Меня беспокоит то, что мне нужно сохранить Job, чтобы запросить базу данных, когда новый созданный Job не интересен в этом контексте.
Перемещение вызова persist() в конец фрагмента дает указанную выше ошибку.

Я знаю, что объект, над которым я работаю, не сохраняется, но сохранение делает невозможным откат при возникновении ошибки.

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

ответ

3

Кажется логичным, что вы не можете запросить что-то, чего еще нет в базе данных, нет? Вы можете начать использовать транзакции. В простом случае ваша сессия будет иметь одну транзакцию, которая будет открыта до закрытия сеанса. В этот момент транзакция будет совершена, и все ваши изменения будут сохранены. Все, что вам нужно, - откат транзакции в случае ошибки.

P.S. Here at the bottom вы можете найти «Типичная транзакция должна использовать следующую идиому».

Session sess = factory.openSession(); 
Transaction tx; 
try { 
tx = sess.beginTransaction(); 
    //do some work 
    ... 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 
+0

Возможно, ссылка на ссылку не работает. – kipz 2010-12-24 23:01:02

+0

Исправлена ​​ссылка и добавлен код на всякий случай. – 2010-12-27 19:18:11

0

Я знаю, что я не могу запросить то, что еще не было сохранено, - и это тоже не так. То, что я хочу найти, это другие Entity beans. Не тот же тип, но любой тип бобы Entity, которые у меня есть. И затем я получаю TransientObjectException.

Я упоминал, что я использую JBoss? Я считаю, что с помощью J2EE и JPA сервер контролирует мои транзакции, и последнее, что я хочу сделать, это мешать ему ?! Так что для меня, помимо использования requireNew и т. Д., Я не связываюсь с транзакциями - сервер делает.

Возможно, мне нужно переместить тег спящего режима, потому что на самом деле я использую JPA - JBoss использует спящий режим. Поэтому, пожалуйста, обращайтесь к этому в любых примерах кода.

0

Даже если вы сохраняете объект, вы все равно можете откатить его. Только после вызова flush на EntityManager будет выполняться синхронизация с базой данных.

0

Ну, я думаю, что ответы и чтение немного в Java EE 5Tutorial дали мне правильный ответ.

Напротив моей веры, persist() делает не flush в базу данных, он только перемещает объект Entity в состояние persisted. То, что меня обмануло, это то, что я заметил, что после вызова persist сущность фактически сохраняется в базе данных в любом случае (и, возможно, слово «save» в сообщении об ошибке). Я воспринял это как флеш, который назывался завершением моей транзакции, но если я получу правку, я все равно могу откат - сам или сервером на исключение.

Итак, заключение, которое я делаю; persist следует просто вызывать, всякий раз, когда создается новый объект, если он не связан с другим объектом, который уже сохраняется.
Затем транзакция поддерживается, и сервер вам больше нравится;)

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

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