有两个类,Class表示班级,Student表示学生,两者之间是一对多的关系。
Class有以下属性:
private int id;//id号
private String name;//班级名
private Set students;//学生集合
Student有以下属性:
private int id;//id号
private String name;//姓名
private Class cla;//班级
Class.hbm.xml配置如下:
<hibernate-mapping>
<class table="t_class" name="cn.edu.cqu.model.Class">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" cascade="all">
<key column="cid"/>
<one-to-many class="cn.edu.cqu.model.Student"/>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml配置如下:
<hibernate-mapping>
<class table="t_student" name="cn.edu.cqu.model.Student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="cla" column="cid"/>
</class>
</hibernate-mapping>
这时候,在Class的映射文件中的一对多标签中没有配置inverse属性,表示这个一对多关系由Class主控,这时,如果通过Class存储Student(在一对多标签中配置了cascade="all",存储Class的时候会将与之关联的Student也存储到数据库中),比如:
session.beginTransaction();
cn.edu.cqu.model.Class c1=new cn.edu.cqu.model.Class();
c1.setName("软件班");
Set students=new HashSet();
c1.setStudents(students);
Student s1=new Student();
s1.setName("Tom");
c1.getStudents().add(s1);
session.save(c1);
session.getTransaction().commit();
Hibernate在存储Student的时候会执行两条sql语句:
Hibernate: insert into t_class (name) values (?)
Hibernate: insert into t_student (name, cid) values (?, ?)
Hibernate: update t_student set cid=? where id=?
第一条语句将Student存储到数据库中,cid为空,第二条语句由Class对象将刚才存入数据库中的Student的id号设为自己的id号
如果将Student的cla属性配置为not-null="true",即表t_student的cid字段为not null就会出现异常:
not-null property references a null or transient value: cn.edu.cqu.model.Student.cla
所以,在配置一对多关系的时候,最好将关联控制交给多的一端维护。