`
helpbs
  • 浏览: 1154962 次
文章分类
社区版块
存档分类
最新评论

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"

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics