Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠合并父级与分离的子级_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 休眠合并父级与分离的子级

Java 休眠合并父级与分离的子级,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我遇到了一个将实体与其集合中一个分离的子实体合并的问题。它抛出异常: org.hibernate.PersistentObjectException:传递给persist的分离实体:com.adastragrp.cmsms.data.SeedNumber 您可以在这个测试方法中看到,我从DB获取一些队列,并获取它的child。当它们被发送到saveQueue方法时,它们处于分离状态。在这个方法中,我将它们添加到其他队列中。合并此队列时,hibernate抛出异常 我怎样才能让它工作?谢谢你的回答

我遇到了一个将实体与其集合中一个分离的子实体合并的问题。它抛出异常: 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);
    }
}