inverse主要用在一对多和多对多双向关联上,可以被设置到集合标签<set>上,
默认inverse为false。
inverse只对set+one-to-many或many-to-many有效,对many-to-one, one-to-one无效。
hibernate 一对多 单向
classes---->student (one--->many)
类:
one
public class Classes {
private Integer id;
private String name;
private Set students;
}
many
public class Student {//不用动
private Integer id;
private String name;
}
hbm.xml
Classes.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.model"> <class name="Classes" table="classes" > <id name="id" column="id" type="java.lang.Integer"> <generator class="native" /> </id> <property name="name" column="name" type="java.lang.String" /> <set name="students"> <key column="class_id" /> <one-to-many class="com.model.Student" /> </set> </class> </hibernate-mapping>
Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zd.model">
<class name="Student" table="student" >
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" length="50" type="java.lang.String" />
</class>
</hibernate-mapping>
测试用例
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import junit.framework.TestCase;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.model.Classes;
import com.model.Student;
public class OneToManyTest extends TestCase {
public void testSave1(){
Session session = null;
Transaction ta = null;
try{
session = HibernateUtil.getSession();
ta = session.beginTransaction();
Student stu1 = new Student();
stu1.setName("z3");
Student stu2 = new Student();
stu2.setName("l4");
session.save(stu1); //一定要先保存,要不是瞬时对象
session.save(stu2);
Set stuSet = new HashSet();
stuSet.add(stu1);
stuSet.add(stu2);
Classes c = new Classes();
c.setName("Java Class");
c.setStudents(stuSet);
session.save(c);
ta.commit();
}catch(Exception e){
e.printStackTrace();
if(ta != null){
ta.rollback();
}
}finally{
//关闭session, user变为detached离线对象
HibernateUtil.closeSession(session);
}
}
Hibernate: insert into student (name) values (?)
Hibernate: insert into student (name) values (?)
Hibernate: insert into classes (name) values (?)
Hibernate: update student set class_id=? where id=?
Hibernate: update student set class_id=? where id=?
注:表student 的字段class_id必须null(若为not null,就会报错)。多了2条update, 所以one-to-many保存时,不太好,不推荐。