此篇会演示多对一关系的数据保存
上代码
Student.java
public class Student {
private int id;
private String name;
private int age;
//保存班级
private Clazz clazz;
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public Student(int id) {
this.id = id;
}
//空参构造
public Student() {
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
Clazz.java
public class Clazz {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Clazz() {}
public Clazz(String name) {
this.name = name;
}
}
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<!-- 自动创建表 -->
<property name="hbm2ddl.auto">create</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<mapping resource="com/gxxy/student/domain/Student.hbm.xml"/>
<mapping resource="com/gxxy/student/domain/Clazz.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.gxxy.student.domain.Student" table="Student">
<id name="id" column="s_id">
<generator class="native"></generator>
</id>
<property name="name" column="s_name"/>
<property name="age" column="s_age"/>
<!-- 通过clazz可以找到对应的Clazz类 对应到c_id -->
<many-to-one name="clazz" column="c_id"/>
</class>
</hibernate-mapping>
Clazz.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.gxxy.student.domain.Clazz" table="Clazz">
<id name="id" column="c_id">
<generator class="native"></generator>
</id>
<property name="name" column="s_name"/>
</class>
</hibernate-mapping>
创建数据和提交数据
@Test
public void m2o() {
Session session = null;
Transaction transaction = null;
//创建学生对象
Student s1 = new Student("张三",18);
Student s2 = new Student("李四",19);
//创建班级对象
Clazz clazz1 = new Clazz("java");
Clazz clazz2 = new Clazz("web");
//给学生添加班级
s1.setClazz(clazz2);
s2.setClazz(clazz1);
try {
session = HibernateUitl.getSession();
//开启事务
session.beginTransaction();
//添加数据
session.save(clazz1);
session.save(clazz2);
session.save(s1);
session.save(s2);
transaction = session.getTransaction();
//提交事务
transaction.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (transaction.isActive()) {
transaction.rollback();
}
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
}
需要注意的只有逻辑
这里展示的是多个学生对应一个班级
在
Student.hbm.xml中最后设置的c_id要对应clazz中的主键
结果图