gpt4 book ai didi

java - Hibernate 将父级与分离的子级合并

转载 作者:行者123 更新时间:2023-12-02 12:14:26 25 4
gpt4 key购买 nike

我遇到了将实体与其集合中一个分离的子实体合并的问题。它抛出异常:org.hibernate.PersistentObjectException:传递给持久化的分离实体:com.adastragrp.cmsms.data.SeedNumber

您可以在这个“test()”方法中看到,我从数据库中获取一些队列并获取其子队列。当它们被发送到“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);
}

DAO 代码:

public Queue save(Queue entity) {
if (entity == null) {
LOG.info("queue is null");
return null;
}
if (getEntityManager().contains(entity)) {
return entity;
}

entity = getEntityManager().merge(entity);

return entity;
}

这是父类:

@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;
}
}

这是子类:

@Entity
@Table(name = "CMSMS_SEED_NUMBER")
@SequenceGenerator(name = "SeedNumberSeq", sequenceName = "CMSMS_SEED_NUMBER_SEQ", allocationSize = 1)
public class SeedNumber {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SeedNumberSeq")
@Column(name = "ID")
private Long id;

@Column(name = "PHONE_NUMBER")
private String phoneNumber;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "QUEUE_ID")
private Queue queue;


public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getPhoneNumber() {
return phoneNumber;
}

public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}

public Queue getQueue() {
return queue;
}

public void setQueue(Queue queue) {
this.queue = queue;
}


}

最佳答案

我认为以下代码有问题:

if (getEntityManager().contains(entity)) {
return entity;
}

entity = getEntityManager().merge(entity);

return entity;

如果您希望 cascade=MERGE 传播到种子编号列表,则不应跳过对 merge 的调用。

恕我直言,一个更清晰的解决方案是像这样实现 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 放在私有(private)方法上没有任何效果。

关于java - Hibernate 将父级与分离的子级合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46299559/

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