Java 休眠合并父级与分离的子级
我遇到了一个将实体与其集合中一个分离的子实体合并的问题。它抛出异常: org.hibernate.PersistentObjectException:传递给persist的分离实体:com.adastragrp.cmsms.data.SeedNumber 您可以在这个测试方法中看到,我从DB获取一些队列,并获取它的child。当它们被发送到saveQueue方法时,它们处于分离状态。在这个方法中,我将它们添加到其他队列中。合并此队列时,hibernate抛出异常 我怎样才能让它工作?谢谢你的回答和解释Java 休眠合并父级与分离的子级,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我遇到了一个将实体与其集合中一个分离的子实体合并的问题。它抛出异常: org.hibernate.PersistentObjectException:传递给persist的分离实体:com.adastragrp.cmsms.data.SeedNumber 您可以在这个测试方法中看到,我从DB获取一些队列,并获取它的child。当它们被发送到saveQueue方法时,它们处于分离状态。在这个方法中,我将它们添加到其他队列中。合并此队列时,hibernate抛出异常 我怎样才能让它工作?谢谢你的回答
private void test() {
List<SeedNumber> list = loadQueue();
saveQueue(list);
}
@Transactional
private List<SeedNumber> loadQueue() {
return queueDAO.find("SECONDARY").getSeedNumbers();
}
@Transactional
private void saveQueue(List<SeedNumber> detachedSeeds) {
Queue q = queueDAO.find("DEFAULT");
List<SeedNumber> seeds = new ArrayList<>();
SeedNumber sn = new SeedNumber();
sn.setPhoneNumber("123456");
sn.setQueue(q);
seeds.add(sn);
for(SeedNumber s : detachedSeeds) {
s.setQueue(q);
seeds.add(s);
}
q.setSeedNumbers(seeds);
q = queueDAO.save(q);
}
这是父类:
@Entity
@Table(name = "CMSMS_QUEUE")
public class Queue {
@Id
@Column(name = "ID", length = 40)
private String id;
@OneToMany(mappedBy = "queue", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<SeedNumber> seedNumbers;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<SeedNumber> getSeedNumbers() {
return seedNumbers;
}
public void setSeedNumbers(List<SeedNumber> seedNumbers) {
this.seedNumbers = seedNumbers;
}
}
我认为以下代码有问题:
if (getEntityManager().contains(entity)) {
return entity;
}
entity = getEntityManager().merge(entity);
return entity;
如果希望cascade=MERGE传播到种子编号列表,则不应跳过对MERGE的调用
IMHO,一个更清晰的解决方案是实现saveQueue,如下所示:
private void saveQueue(List<SeedNumber> detachedSeeds) {
Queue queue = queueDAO.find("DEFAULT");
SeedNumber sn = new SeedNumber();
sn.setPhoneNumber("123456");
sn.setQueue(q);
seedNumberDao.saveSeed(sn);
for (SeedNumber seed : detachedSeeds) {
seed.setQueue(queue);
seedNumberDao.saveSeed(seed);
}
}
作为补充说明,将@Transactional放在私有方法上没有效果 是的,你说得对:当对象已经在PersistanceContext中时,我没有意识到我跳过了合并。谢谢!关于@Transactional注释,我使用Maven AspectJ插件,因此它也适用于私有方法。
if (getEntityManager().contains(entity)) {
return entity;
}
entity = getEntityManager().merge(entity);
return entity;
private void saveQueue(List<SeedNumber> detachedSeeds) {
Queue queue = queueDAO.find("DEFAULT");
SeedNumber sn = new SeedNumber();
sn.setPhoneNumber("123456");
sn.setQueue(q);
seedNumberDao.saveSeed(sn);
for (SeedNumber seed : detachedSeeds) {
seed.setQueue(queue);
seedNumberDao.saveSeed(seed);
}
}