我知道有很多关于这个错误的问题。我已经尝试过了,没有解决任何问题。
我有一个已经在数据库中的dtoDevice。我从数据库中获取了数据。现在我想将dtoValue对象添加到该设备,但它不起作用。
我有以下DTO课程
@Entity
public class DtoValue {
@Id
@GeneratedValue
protected int id;
private int value;
@ManyToOne
private DtoDevice dtoDevice;
... /* Getters and Setters */
}
和
@Entity
public class DtoDevice{
@Id
@GeneratedValue
protected int id;
String deviceName;
@OneToMany(cascade= CascadeType.REMOVE)
List<DtoValue> values;
... /* Getters and Setters */
public void addValue(DtoValue dtoValue){
if(dtoValue != null)
values.add(dtoValue);
dtoValue.setDtoDevice(this);
}
}
当我尝试运行此代码时:
... /* em = EntityManager */
try{
em.getTransaction().begin();
DtoValue dtoValue = new DtoValue();
dtoValue.setValue(1);
/* Even if I try saving dtoValue here (em.persist/merge(dtoValue)) It doesn't work */
**// THIS dtoDevice is already in the DB - I want to modify it**
dtoDevice.addValue(dtoValue);
/* Even if I try saving dtoValue here (em.persist/merge(dtoValue)) It doesn't work */
/* persist doesnt work, since dtoDevice is already in the DB */
em.merge(dtoDevice);
em.getTransaction().commit();
}
catch(Exception e){
em.getTransaction().rollback();
showConnectionError(e);
}
我收到错误:
org.hibernate.TransientObjectException: object is an unsaved transient instance - save the transient instance before merging: **not_important**.model.DtoValue
到目前为止,我尝试了很多方法,并且没有提供任何建议。
答案 0 :(得分:0)
您首先尝试保存DtoDevice,然后将dtoValue分配给DtoDevice,然后保存DtoDevice。
答案 1 :(得分:0)
当你去保存DtoDevice时,它有一个未保存的DtoValues集合(问题的根源)。您可以通过以下几种方式解决:
1 - 将PERSIST添加到从DtoDevice到DtoValues的级联操作列表中,如下所示:
@OneToMany(cascade= {CascadeType.REMOVE, CascadeType.PERSIST})
List<DtoValue> values;
2 - 保存每个新的DtoValue,然后将它们添加到DtoDevice中,如下所示:
DtoValue dtoValue = new DtoValue();
dtoValue.setValue(1);
DtoValue savedDtoValue = ... save it here
dtoDevice.addValue(savedDtoValue);