<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.yanglg.hibernate.domain">
<class name="Classroom" table="t_classroom">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" length="20" />
<property name="classno" length="30" />
<set name="stus" lazy="extra" inverse="true">
<key column="cid" />
<one-to-many class="Student" />
</set>
</class>
</hibernate-mapping>
Classroom实体类:
package org.yanglg.hibernate.domain;
import java.util.HashSet;
import java.util.Set;
public class Classroom {
private int id;
private String name;
private String classno;
private Set<Student> stus;
public Classroom() {
setStus(new HashSet<Student>());
}
public void addStudent(Student student) {
stus.add(student);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassno() {
return classno;
}
public void setClassno(String classno) {
this.classno = classno;
}
public Set<Student> getStus() {
return stus;
}
public void setStus(Set<Student> stus) {
this.stus = stus;
}
}
Classroom c = new Classroom();
c.setName("09wb");
c.setClassno("200912");
Student s1 = new Student();
s1.setName("name001");
s1.setIdcard("234");
Student s2 = new Student();
s2.setName("name002");
s2.setIdcard("234333");
c.addStudent(s1);
c.addStudent(s2);
session.save(s1);
session.save(s2);
session.save(c);
这样:若没有inverse="true",则发如下sql:
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)
Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)
Hibernate: insert into t_classroom (name, classno, id) values (?, ?, ?)
Hibernate: update t_student set cid=? where id=?
Hibernate: update t_student set cid=? where id=?
三条插入,两条更新,这和manytoone的时候意思是一样的
<set name="stus" lazy="extra" inverse="true">
<key column="cid" />
<one-to-many class="Student" />
</set>
若是加上inverse="true"
Sql:
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)
Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)
Hibernate: insert into t_classroom (name, classno, id) values (?, ?, ?)
此时数据库的存储会不对!!!!!!!!
inverse="true"明确表示一的一端不维护关系
若你加上inverse="true"還要用一的一端来维护关系,那么对不起,等着出错吧!!
总上所述:
1、若映射为单向,many-to-one要优于one-to-many,原因很明显,用一的一端来维护关系比较麻烦
2、Save对象时,要先save一的一端,然后在save多的一端(设置其一的一端的属性)
3、加上inverse时,莫要再用一的一端来维护关系,会出错的!