Hibernate的学习——7.hibernate关系映射_多对一
7.hibernate关系映射_多对一
创建一个班级表和一个学生表,每个学生对应一个班级,每个班级对应多个学生。
- 首先利用hibernate的SchemaExport工具类自动创建表的功能,来自动根据实体类来创建表。代码和截图如下。
@Test
private static void CreatDB() {
/**
* 将对象信息转化为关系信息。
*/
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
//第一个参数是打印ddl语句.
//第二个参数是否将ddl到数据库执行。
se.create(true,true);
}
还可以在配置文件里通过配置property的参数来实现自动创建表的功能。截图如下:
- 写一个班级类Cluss,里面有id,name,address三个属性和他们的set/get方法。
package www.itheima.bean;
public class Cluss {
private int id;
private String name;
private String address;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 配置Cluss.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">
<!-- package用于指定类型所在的包 如果不指定,那么在指定class的name时,需要指定完全限定名 -->
<hibernate-mapping package="www.itheima.bean">
<class name="Cluss" table="t_class">
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="address"/>
</class>
</hibernate-mapping>
- 创建Student类,里面包含了id,name,age,sex,cluss的属性,并有set/get方法。其中cluss的类型是Cluss类型。
package www.itheima.bean;
public class Student {
private int id;
private String name;
private int age;
private String sex;
private Cluss cluss;
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 void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Cluss getCluss() {
return cluss;
}
public void setCluss(Cluss cluss) {
this.cluss = cluss;
}
}
学生表和班级表的对应关系如下图,学生和班级信息是一个多对一的关系,cluss_id是学生表中的外键.
- 配置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">
<!-- package用于指定类型所在的包 如果不指定,那么在指定class的name时,需要指定完全限定名 -->
<hibernate-mapping package="www.itheima.bean">
<class name="Student" table="t_student">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
<property name="sex"/>
<!--
name为属性名
column为外键名
-->
<many-to-one name="cluss" column="cluss_id"></many-to-one>
</class>
</hibernate-mapping>
- 写一个测试类去保存数据,
@Test
public static void test1(){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Cluss c1=new Cluss();
c1.setName("301");
c1.setAddress("A-3");
Cluss c2=new Cluss();
c2.setName("208");
c2.setAddress("B-3");
session.save(c1);
session.save(c2);
Student s1=new Student();
s1.setName("张三");
s1.setAge(23);
s1.setSex("男");
//设置学生的外键,如果不设置,保存的学生将没有外键值
s1.setCluss(c1);
Student s2=new Student();
s2.setName("李四");
s2.setAge(50);
s2.setSex("男");
//设置学生的外键,如果不设置,保存的学生将没有外键值
s2.setCluss(c1);
Student s3=new Student();
s3.setName("王五");
s3.setAge(53);
s3.setSex("女");
//设置学生的外键,如果不设置,保存的学生将没有外键值
s3.setCluss(c2);
session.save(s1);
session.save(s2);
session.save(s3);
tx.commit();
}
注意:在这种多对一的关系中,“多”的那个实体类应该定义一个“一”的类型的变量