使用带有 JPA 的线程保存实体(同步)
Save entity using threads with JPA (synchronized)
我在 JAVA 中使用线程对同一实体执行一些操作。当我执行 persist 方法时出现问题。接下来我的做法是:
@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)
我已经尝试对对象进行锁定乐观但没有结果。
您将方法标记为事务性的,同时您在保存之前开始事务,这导致打开两个会话将代码更改为,
@Transactional
private void persist(){
synchronized(this){
<nameObject>.save();
}
}
或
private void persist(){
synchronized(this){
JPA.em().getTransaction().begin();
<nameObject>.save();
JPA.em().getTransaction().commit();
}
}
我在 JAVA 中使用线程对同一实体执行一些操作。当我执行 persist 方法时出现问题。接下来我的做法是:
@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)
我已经尝试对对象进行锁定乐观但没有结果。
您将方法标记为事务性的,同时您在保存之前开始事务,这导致打开两个会话将代码更改为,
@Transactional
private void persist(){
synchronized(this){
<nameObject>.save();
}
}
或
private void persist(){
synchronized(this){
JPA.em().getTransaction().begin();
<nameObject>.save();
JPA.em().getTransaction().commit();
}
}