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

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]
    没测试过,不知道是不是正确的,不过觉得可以给你参考。

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

报告相同问题?

悬赏问题

  • ¥15 QTableWidget重绘程序崩溃
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding