object references an unsaved transient instance - save the transient instance before flushing

今天在测试hibernate的时候,发生了object references an unsaved transient instance - save the transient instance before flushing: com.aaa.bean.Tutor这样的错误。

一般来说,这样的错误还是挺常见的。但是问题恰恰出现在不常见的地方。先贴配置文件和测试代码:





    @Test
    public void addRecordTest2() throws ParseException {
        Session session = HbSessionUtil.getSession();
        Transaction transaction = session.beginTransaction();

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = dateFormat.parse("2015-09-09");
        Graduate graduate1 = new Graduate("aaaa", "男", date);
        Graduate graduate2 = new Graduate("bbb", "男", date);

        Tutor tutor1 = new Tutor("1111", "11", "1111");

        tutor1.getGraduates().add(graduate1);
        tutor1.getGraduates().add(graduate2);
        //保存一的一方
        session.save(tutor1);

        transaction.commit();
        session.close();
    }

实际上我已经在配置文件中设置了cascade="save-update",还出错,这就有点郁闷了。


出现object references an unsaved transient instance - save the transient instance before flushing的错误就是因为在保存一个实体的时候,实体中存在对其他实体的引用,但是该引用的实体并没有存在于已有的数据库中和hibernate缓存中(更准确地讲,是出于游离态 ,这就是所谓的transient instance)。要解决这样的问题要么就手动保存出于游离态的那些实体,要么就设置cascade="all"或者="save-update",让hibernate保存一方的时候保存另一方。


从代码中可以看到我要保存的是tutor1,tutor有个set集合,集合中放的是graduate对象,我在配置文件中设置了cascade="save-update",就已经告诉了hibernate,在我保存tutor的时候要帮我保存set集合中的内容。理论上来说是没有问题的。


再仔细看看报错信息,save the transient instance before flushing: com.aaa.bean.Tutor。是在保存tutor的时候出错的,这就匪夷所思了。tutor是我手动保存的啊,怎么会有问题呢?!  哪里还存在出于游离态的tutor没有被我手动保存呢?经过仔细对比排查,发现,我居然是在Graduate的bean中new了一个tutor。


所以当hibernate自动帮我报graduate对象的时候,它发现里面还有一个游离态的tutor对象,就报错了。





  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值