怎样解决Hibernate: identifier of an instance of Term was altered from X to Y 异常?

/**
 * 学期课程
 */
@Entity
@Table(name="T_kc_TermCourse")
public class TermCourse extends AbstractPersistentInfo { 
    // 学期
    private Term term;
    // 课程
    private Course course;
    
    @ManyToOne
    @JoinColumn(name="term")
    public Term getTerm() {
        return term;
    }
    
    //...此处省略无关的属性及setter\getter方法

}

    我在更新 TermCourse 实体中的 term 属性时发生了这样的异常。但更新对象的外键属性是非常常见的操作,为什么在这一次不行呢。后来查看代码,才发现了问题所在。

/**
* @param termCourse 是前端页面传输过来的数据
*/
public String edit() throws Exception {

    TermCourse temp = termCourseService.getById(termCourse.getId());

    temp.getTerm().setId(termCourse.getTerm().getId());

    termCourseService.update(temp);

}

      原来代码中在更新termCourse实体时先通过hibernate的关联查询,将term对象查询出来,然后再修改term的id主键。最后将修改后的termCourse持久化到数据库中。

     这样做是错误的,因为通过关联查询 term 属性 处于持久态(Hibernate中bean对象被划分为三个状态:瞬时态、持久态、托管态),该状态下的term对象已经交给hibernate管理了,此时修改了它的id主键,被hibernate检测到,才会引发该异常。若将瞬时态的term设为该termCourse对象的属性,即可解决该异常

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值