Hibernate中的级联一对多关系

两个pojo,Baby 和Baby File
对应数据库中表baby和babyfile.两个表有外键关联,且babyfile的外键不能为空
配置了个单向一对多,级联关系为save-update
/**
     *
     * @author weip
     * @time 2006-5-10 16:23:19
     * @return Set
     *
     * @hibernate.set lazy="true" cascade="save-update"
     * @hibernate.collection-key column="babyId"
     * @hibernate.collection-one-to-many class="com.mofile.baby.domain.BabyFile"
     */
    public Set getFileSet() {
        return fileSet;
    }

在修改session中的baby中babyfile,然后提交,结果报错:
。。。。。。。。。。。。
Hibernate: insert into babyfile (sequence, type) values (?, ?)
(JDBCExceptionReporter.java:49) - could not insert: [com.mofile.baby.domain.BabyFile]
java.sql.SQLException: Cannot add or update a child row: a foreign key constraint fails (`baby/babyfile`, CONSTRAINT `babyfile_fk` FOREIGN KEY (`babyid`) REFERENCES `baby` (`id`))
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2847)

原来在插入新的babyfile的时候,没有外键信息,所以违反了外键约束,实际上就是插入空外键出错。

不得已只能在BabyFile加入babyid,做了如下配置就好了
/**
     *
     * @author weip
     * @time 13:56:23 2006-5-14
     * @return int
     * @hibernate.property not-null="true" column="babyid" size="5"
     */
    public int getBabyid() {
        return babyid;
    }

当然也可以使用getBaby(),考虑到性能方面,所以没有这样作

修改之后的hibernate操作如下:
Hibernate: insert into babyfile (sequence, type, babyid) values (?, ?, ?)
Hibernate: update babyfile set babyId=? where id=?

第二句很多余,推测应该inverse="true",

于是改配置在一对多的关系中加上inverse="true",
修改之后的hibernate操作如下:
Hibernate: insert into babyfile (sequence, type, babyid) values (?, ?, ?)
没有了第二句

结论:
看来有非空外键约束且有save-update或者all-delete-orphanh或者all级联的一对多关系(delete级联没试过不知道如何),必须配置双向关联,且最好inverse="true"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值