gpt4 book ai didi

java - 使用 JPA 线程保存实体(同步)

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:50 24 4
gpt4 key购买 nike

我正在使用 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)

我尝试对对象进行锁定乐观,但没有结果。

最佳答案

您将该方法标记为事务性,同时您在保存之前开始事务,这导致打开两个 session 将代码更改为,

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

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

关于java - 使用 JPA 线程保存实体(同步),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com