hibernate关系映射demo(多对多)

本文详细介绍了使用Hibernate框架处理学生与课程之间的多对多关系的方法,包括实体类的设计、XML配置文件的编写以及如何通过中间表进行业务逻辑的扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备两个实体,学生和课程

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();
		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值