hibernate 一对多的问题 请高手们进来交流一下
最近使用了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不提倡这种方式,而是要把多对一的一端作是双向关系的主体端,但我不太明白如果用多对一作为主体则插入时要多次分别插入,但已一对多作为主体的话就可以一次性插入主表和所有从表的数据,应该很方便一些啊,我现在的需求就是一次性插入班级表和所有对应的学生,记得以前用配置文件而不是注解的时候,没碰到这些奇怪问题
请碰到过这些问题的专家来说说你们的解决方案