Hibernate多对多 关联映射(many-to-many)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;
Hibernate会为我们创建中间关联表,转换成两个一对多。
映射文件配置如下:
<set name=“xxx" table=“xxx">
<key column=“xxx"/>
<many-to-many class=“xxx" column=“xxx"/>
</set>
图示如下:
多对多(student - course) => 两个一对多
Student实体domain类如下:
public class Student implements java.io.Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
<span style="color:#ff0000;">private Set<Studcourse> studcourses;</span>
给id和name,studcourses属性 set和get方法
}
Course实体domain类如下:
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
<span style="color:#ff0000;">private Set<Studcourse> studcourses</span>
给id,name,studcourses属性 set和get方法
}
Studcourse实体domain类如下:
<pre name="code" class="java">public class M2MStudcourse implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
<span style="color:#ff0000;">private Student student;
private Course course;</span>
private Integer grade;
给所有的属性 set和get方法
}
Student的映射文件 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.hl.domain">
<class name="Student" table="Student">
<id name="id" column="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">Student_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="false"></column>
</property>
<span style="color:#ff0000;"><set name="Studcourses" cascade="all">
<key column="Student_id" />
<one-to-many class="Studcourse" />
</set></span>
</class>
</hibernate-mapping>
Course的映射文件 Course.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.hl.domain">
<class name="Course" table="Course">
<id name="id" column="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">Course_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="false"></column>
</property>
<span style="color:#ff0000;">
<set name="Studcourses" cascade="save-update">
<key column="Course_id"/>
<one-to-many class="Studcourse"/>
</set></span>
</class>
</hibernate-mapping>
Studcourse的映射文件 Studcourse.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.hl.domain">
<class name="Studcourse" table="Studcourse">
<id name="id" column="id" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">Studcourse_seq</param>
</generator>
</id>
<property name="grade" type="java.lang.Integer">
<column name="grade"/>
</property>
<span style="color:#ff0000;"><many-to-one name="Course" column="Course_id"/>
<many-to-one name="Student" column="Student_id"/></span>
</class>
</hibernate-mapping>
hibernate.cfg.xml 关键配置如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="connection.url">
?????
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="show_sql">true</property>
<property name="myeclipse.connection.profile">
oracle.jdbc.driver.OracleDriver
</property>
<span style="color:#ff0000;"><property name="hbm2ddl.auto">update</property>
<mapping resource="com/hl/domain/M2MCourse.hbm.xml" />
<mapping resource="com/hl/domain/M2MStudcourse.hbm.xml" />
<mapping resource="com/hl/domain/M2MStudent.hbm.xml" /></span>
</session-factory>
</hibernate-configuration>
测试如下:
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=null;
Transaction tx=null;
try {
session=HibernateUtil.getCurrentSession();
tx=session.beginTransaction();
//doing something
Student s=new Student();
s.setName("jojo3");
Course c=new Course();
c.setName("j2ee");
Studcourse sc=new Studcourse();
sc.setGrade(45);
sc.setCourse(c);
sc.setStudent(s);
session.save(c);
session.save(s);
session.save(sc);
tx.commit();
} catch (Exception e) {
// TODO: handle exception
if (tx!=null) {
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}finally{
if (session!=null&&session.isOpen()) {
session.close();
}
}
}
关键代码,请看红色部分!