准备两个实体,学生和课程
public class StudentBean {
private int id;
private String name;
private Set<CourseBean> courses = new HashSet<CourseBean>();
//提供getter,stter
}
public class CourseBean {
private int id;
private String name;
private Set<StudentBean> studentBeans = new HashSet<StudentBean>();
//提供getter,stter
}
配置xml
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>
<class name="com.project.bean.StudentBean" table="student">
<id name="id" column="s_id">
<generator class="increment"></generator>
</id>
<property name="name" column="s_name"></property>
<!-- 加上级联(cascade),不然会报错 -->
<set name="courses" table="mid" cascade="save-update">
<!-- key 当前这个对象的主键在中间的列名 -->
<key column="s_id"></key>
<!-- column 集合中的对象在中间表的名称 -->
<many-to-many class="com.project.bean.CourseBean" column="c_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
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>
<class name="com.project.bean.CourseBean" table="course">
<id name="id" column="c_id">
<generator class="increment"></generator>
</id>
<property name="name" column="c_name"></property>
<set name="studentBeans" table="mid" cascade="save-update">
<key column="c_id"></key>
<many-to-many class="com.project.bean.StudentBean" column="s_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
测试代码
public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
StudentBean stu = new StudentBean();
stu.setName("小明");
CourseBean cour = new CourseBean();
cour.setName("javaSE");
stu.getCourses().add(cour);
session.save(stu);
session.beginTransaction().commit();
session.close();
}
中间表/关系表有业务的解决办法
增加一个实体类。例如学生和课程,如果在中间表添加选课时间,次数等,可以多写一个类来映射。
新增一个实体
public class ChooseBean {
private int id;
private StudentBean stu;
private CourseBean course;
private Date date; //中间表的其他列
//提供getter,setter
}
修改student和course
public class StudentBean {
private int id;
private String name;
private Set<ChooseBean> chooses = new HashSet<ChooseBean>();
//提供getter,setter
}
public class CourseBean {
private int id;
private String name;
private Set<ChooseBean> chooses = new HashSet<ChooseBean>();
//提供getter,setter
}
配置xml
choose.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>
<class name="com.project.bean.ChooseBean" table="mid">
<id name="id" column="ch_id">
<generator class="increment"/>
</id>
<property name="date" column="ch_date"></property>
<!--column 对象在中间表引用的外键-->
<many-to-one name="stu" class="com.project.bean.StudentBean" column="s_id" cascade="save-update"></many-to-one>
<many-to-one name="course" class="com.project.bean.CourseBean" column="c_id" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
修改student.hbm.xml和course.hbm.xml的<set>
<?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>
<class name="com.project.bean.CourseBean" table="course">
<id name="id" column="c_id">
<generator class="increment"></generator>
</id>
<property name="name" column="c_name"></property>
<!-- 修改 -->
<set name="chooses" cascade="save-update">
<key column="c_id"></key>
<one-to-many class="com.project.bean.ChooseBean" ></one-to-many>
</set>
<!-- 修改 -->
</class>
</hibernate-mapping>
<?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>
<class name="com.project.bean.StudentBean" table="student">
<id name="id" column="s_id">
<generator class="increment"></generator>
</id>
<property name="name" column="s_name"></property>
<!-- 修改 -->
<set name="chooses" cascade="save-update">
<key column="s_id"></key>
<one-to-many class="com.project.bean.ChooseBean"></one-to-many>
</set>
<!-- 修改 -->
</class>
</hibernate-mapping>
测试代码
public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
StudentBean stu = new StudentBean();
stu.setName("小明");
CourseBean cour = new CourseBean();
cour.setName("javaSE");
ChooseBean choos = new ChooseBean();
choos.setCourse(cour);
choos.setStu(stu);
choos.setDate(new Date());
stu.getChooses().add(choos);
session.save(stu);
session.beginTransaction().commit();
session.close();
}