cargoj 2011-05-19 17:45 采纳率: 100%
浏览 1352
已采纳

hibernate报错object references an unsaved transient instance

hibernate报错object references an unsaved transient instance - save the transient instance before flushing: com.king3d.manage.domain.Sys2;

从URL传入参数,会报这个错误,但是JUNIT中测试就没有任何问题,不知道原因。action与service代码如下

[code="java"]
@Action(results = { @Result(type = "json") }, value = "saveSub")
public String saveSub() throws Exception {
Tools.decodeObject(sys2);
dic.saveDictionaryData(sys2);
resultStatus = "true";
return "success";
[/code]

[code="java"]
@Transactional
public void saveDictionaryData(Sys2Vo sys2vo) throws Exception {
Sys2 entry = new Sys2();
BeanUtils.copyProperties(sys2vo, entry);
if(sys2vo.getId() > 0){
this.sys2Dao.update(entry);
}else{
this.sys2Dao.save(entry);
}
sys2vo.setId(entry.getId());
}
[/code]

[code="java"]
public class Sys2 {
@Id
@SequenceGenerator(name="sys2",sequenceName="SEQ_SYS2_ID",allocationSize=1 )
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sys2")
private int id;
private int key;
private String value;
@ManyToOne
@JoinColumn(name="SYS1_ID")
private Sys1 sys1;
@ManyToOne
@JoinColumn(name="PARENT_ID")
private Sys2 sys2;
@OneToMany(mappedBy="sys2")
private List sys2s=new ArrayList();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getKey() {
return key;
}
public void setKey(int key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Sys1 getSys1() {
return sys1;
}
public void setSys1(Sys1 sys1) {
this.sys1 = sys1;
}
public Sys2 getSys2() {
return sys2;
}
public void setSys2(Sys2 sys2) {
this.sys2 = sys2;
}
public List getSys2s() {
return sys2s;
}
public void setSys2s(List sys2s) {
this.sys2s = sys2s;
}
}
[/code]

  • 写回答

1条回答 默认 最新

  • slightwei 2011-05-20 13:21
    关注

    [code="java"] @Transactional

    public void saveDictionaryData(Sys2Vo sys2vo) throws Exception {

    Sys2 entry = new Sys2(); //瞬时状态
    BeanUtils.copyProperties(sys2vo, entry); //把entry复制到sys2vo
    if(sys2vo.getId() > 0){ //不会大于0,因为为空
    this.sys2Dao.update(entry);

    }else{

    this.sys2Dao.save(entry); //是使用了@Transactional此时事物没有提交,数据没有持久化,存在于Session中。
    }

    sys2vo.setId(entry.getId()); //错误是object references an unsaved transient instance,你应该flush()一下。
    } [/code]
    没测试过,不知道是不是正确的,不过觉得可以给你参考。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信