Java 实体管理器批量更新提供org.hibernate.PersistentObjectException:传递给persist的分离实体

Java 实体管理器批量更新提供org.hibernate.PersistentObjectException:传递给persist的分离实体,java,hibernate,Java,Hibernate,我尝试跟随,因为通过批量更新,我会使用“合并”获得不必要的选择: for(int i = 0; i< elements.size(); i++){ Query q = em.createQuery("select p from Parent p join fetch p.child c where p.id=:id", Parent.class); //parameter of :id from elements Parent p = q.get

我尝试跟随,因为通过批量更新,我会使用“合并”获得不必要的选择:

for(int i = 0; i< elements.size(); i++){
    Query q = em.createQuery("select p from Parent p join fetch p.child c where p.id=:id", Parent.class);
    //parameter of :id from elements
    Parent p = q.getSingleResult();
    p.setName("aname"); //for simplicity just the name member
    myList.add(p);
}

utx = com.arjuna.ats.jta.UserTransaction.userTransaction();
utx.begin();
em.joinTransaction();

for(int i = 0; i< myList.size(); i++){
    if (i > 0 && i % Common.BATCH_SIZE == 0) { //BATCH_SIZE=50
        em.flush();
        em.clear();
    }
    Parent myObject = myList.get(i);
    em.merge(myObject);
}
utx.commit();
我还尝试:

session.flush();
session.clear();

同样的错误。是否有我遗漏的内容?

是否检查了列表中是否包含重复的对象?如果一个批处理尝试两次更新具有相同标识符的对象,则可能会遇到此问题

utx = com.arjuna.ats.jta.UserTransaction.userTransaction();
utx.begin();
em.joinTransaction();

Session session = em.unwrap( Session.class );
for(int i = 0; i< myList.size(); i++){
    if (i > 0 && i % Common.BATCH_SIZE == 0) { //BATCH_SIZE=50
        em.flush(); 
        em.clear();
    }
    Parent myObject = elements.get(i);
    session.update(myObject);
}
utx.commit();
detached entity passed to persist: Child
session.flush();
session.clear();