2015-02-13 2 views
0

Я использую потоки в JAVA, чтобы выполнить несколько операций над одним и тем же объектом. Проблема возникает, когда я использую метод persist. Способ, которым я занимаюсь, следующий:Сохранить объект, используя потоки с JPA (синхронизированный)

@Transactional 
    private void persist(){ 
     synchronized(this){ 
      JPA.em().getTransaction().begin(); 
      <nameObject>.save(); 
      JPA.em().getTransaction().commit(); 
     } 
    } 

где nameObject - это имя объекта, который необходимо сохранить. Ошибка, покажите мне это:

Exception in thread "Thread-38" javax.persistence.PersistenceException: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1389) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1317) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1323) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:845) 
    at play.db.jpa.JPABase._save(JPABase.java:31) 
    at play.db.jpa.GenericModel.save(GenericModel.java:204) 
    at models.invoicing.PreInvoiceThread.persist(PreInvoiceThread.java:290) 
    at models.invoicing.PreInvoiceThread.run(PreInvoiceThread.java:273) 
    at java.lang.Thread.run(Thread.java:745) 

меня пытаются сделать lockoptimistic на объект без результатов.

ответ

1

Вы пометили метод как транзакционные и в то же время вы начинаете транзакцию перед сохранением, которая вызывает две сессии, чтобы открыть Изменить код на,

@Transactional 
private void persist(){ 
    synchronized(this){ 
     <nameObject>.save(); 
    } 
} 

или

private void persist(){ 
    synchronized(this){ 
     JPA.em().getTransaction().begin(); 
     <nameObject>.save(); 
     JPA.em().getTransaction().commit(); 
    } 
} 
+0

спасибо! Это решило мою проблему! – javaboygo

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