这是数据库的两张表,classes与student之间的关系是一对多(一个班级有多个学生,而一个学生只能有一个班级)。
Classes.hbm.xml 映射文件如下
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.hibernate.domain.Classes" table="classes" catalog="hibernate02" >
<id name="cid" type="java.lang.Long">
<column name="Id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="Name" length="50" />
</property>
<property name="description" type="java.lang.String">
<column name="Description" length="50"></column>
</property>
<set name="students" cascade="all" inverse="true"><!--key表示为一对多关系中多的一方的外键,cascade表示级联操作,inverse表示有那方维护数据表-->
<key>
<column name="s_cid"></column>
</key>
<one-to-many class="com.hibernate.domain.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://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.hibernate.domain.Student" table="student" catalog="hibernate02">
<id name="sid" type="java.lang.Long">
<column name="Id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="Name" length="50" />
</property>
<property name="description" type="java.lang.String">
<column name="Description" length="50" />
</property>
<many-to-one name="classes" class="com.hibernate.domain.Classes" cascade="all">
<column name="s_cid"></column> <!--多对一映射配置;column表示为一对多关系中多的一方的外键,这里要和Classes.hbm.xml中key标签中的column属性一致-->
</many-to-one>
</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://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/hibernate02
</property>
<property name="connection.username">root</property>
<property name="connection.password">brozer</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hbm2ddl.auto">true</property>
<property name="current_session_context_class">thread</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<mapping resource="com/hibernate/domain/Classes.hbm.xml"></mapping>
<mapping resource="com/hibernate/domain/Student.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
测试方法
@Test
public void testSave(){
session=HibernateSessionFactory.getSession();
transaction=session.beginTransaction();
Classes classes=new Classes();
classes.setDescription("software profession");
classes.setName("13/2");
Set<Student> students=new HashSet<Student>();
Student student=new Student();
student.setClasses(classes);
student.setDescription("11");
student.setName("brozer");
students.add(student);
session.save(student);
transaction.commit();
运行结果如下
因为一对多双向关联,且一对多中多的一方维护双方之间的联系。所以,在保存Student对象时,hibernate底层会自动保存Classes对象。
因本人初学hibernate周期并不是很长,如果文章有不对之处,望读者指正。