hibernate 一对多的问题 请高手们进来交流一下

seward 2008-07-05 01:02:12
最近使用了hibernate 的annotation 注解功能来实现一个一对多的关系,产生几个奇怪的问题,大家看看有什么解决办法。
1,场景
public class ClassBean {
private Integer id;
private String ClassName;
private Map studends;

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name="classId")
@MapKey(name="studentsId")
public Map<String,StudentsBean> getStudents() {
return studends;
}
....
}
public class StudendsBean{
private Integer id;
private String studentsName;
private int classId;
....
}
建立一个班级和学生的表。学生表通过classId和主表关联。 在班级表建立和学生的一对多单向关联,学生表未关联到班级,
数据库sqlserver. 主键ID自增长.
问题:在执行插入操作时,报错,提示学生表找不到班级的主键代号,究其原因是因为,后台操作时先插入主表,再插入从表,在插入从表时classId是用户填写的值,使用sqlserver自增长时,实际上应该是主表自动生成的值,但这里不是主表自动生成的值而是用户填写的值。因第一次使用表为空,所以插入这个值时主表不存大,插入不成功,在执行完插入从表操作后,系统再自动执行一条update SutdentsBean set classId=? where id=? ,也就是说,系统要先向从表中插入一个值,然后再执行修改语句改过来,然而在插入时插入的值主表不存在的情况下就报错, 我先在从表中手工插入一条记录,再把从表的Id设为这个数,结果插入成功。

场情2.

public class ClassBean {
private Integer id;
private String className;
private Map studends;

@OneToMany
@JoinColumn(name="className",referencedColumnName="className")
@MapKey(name="studentsId")
public Map<String,StudentsBean> getStudents() {
return studends;
}
....
}
public class StudendsBean{
private Integer id;
private ClassBean classBean;
private String studentsName;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="className",referencedColumnName="className",insertable=false,updatable=false)
public ClassBean getClassBean() {
return classBean;
}

....
}

建立一个班级和学生的表。学生表通过className和主表的className关联。 在班级表建立和学生的一对多双向关联,
数据库sqlserver. 主键ID自增长.
问题:在执行插入操作时,报错,提示class转化错误, 如果把主表关联的referencedColumnName="className"。去掉,执行时插入报错原因是,系统试图把主键的ID写入className字段。
看说明文档,好象说是hiberate不提倡这种方式,而是要把多对一的一端作是双向关系的主体端,但我不太明白如果用多对一作为主体则插入时要多次分别插入,但已一对多作为主体的话就可以一次性插入主表和所有从表的数据,应该很方便一些啊,我现在的需求就是一次性插入班级表和所有对应的学生,记得以前用配置文件而不是注解的时候,没碰到这些奇怪问题

请碰到过这些问题的专家来说说你们的解决方案
...全文
410 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hao1314 2009-03-21
  • 打赏
  • 举报
回复
一对多还没看过,,刚开始学hibarnate
archko 2008-09-12
  • 打赏
  • 举报
回复
看了你第一个问题,外键是自动增长的啊。因为它是主表的主键。如果要手动的话那就不对了。
HBM.XMl里设置为 cascade='save-update‘ 这样当,更新你的学生表就会自动更新班级表了。因为当你更新学生表时班级表是不会自动更新的。
手动插入一条记录时,外键为空,所以出错了。

一对多,控制端是多的一方,因为如果设置了 上面的 级联,控制端为一的话。那更新多的一方时就会导航的父类(暂时这么称)再导航到所有子类(暂时这么称,)更新其所有子类。这样就多余了。
控制在多的一方,在更新“多”的一方的时候也会导航到父类,然后对其更新。此时没有导航到其子类,所以省了SQL。这样在配置时<set>加上inverse="true" 控制反转,到多的一方。

insertable=false,updatable=false 这个意思是不更新不插入???

以上是我的愚见 希望帮到你
crazy_coder 2008-07-15
  • 打赏
  • 举报
回复
对第一个场景,我也碰到过类似的情况。
如果我没猜错,你的数据库设计中,student表的外键classId是不为空的。
建议你把classId的not-null限制去掉,然后你再试一下。
island_001 2008-07-11
  • 打赏
  • 举报
回复
你写这么多东西很少有人耐心去看!!
lisl2003 2008-07-09
  • 打赏
  • 举报
回复
刚刚接触这一块,没什么好建议,关注一下。

6,787

社区成员

发帖
与我相关
我的任务
社区描述
JBoss技术交流
社区管理员
  • JBoss技术交流社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧