在开发中,数据库表的关系有很多都是多对一的关联关系。如多个学生对应一个班级,通过下面的示例简单了解下在Hibernate中怎么处理这种多对一的关系。
示例:
班级Grade类
public class Grade {
private int id;
private String name;
//省略get/set方法
}
学生Student类
public class Student {
private int id;
private String name;
private int age;
private Grade grade;
//省略get/set方法
}
Grade.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Grade">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
</class>
</hibernate-mapping>
Student.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<property name="age"/>
<!-- 多对一 name表示属性名 class指明属性对应的类
column指明数据库表中的列名 -->
<many-to-one name="grade" class="Grade"
column="grade_Id" foreign-key="fk_grade" not-null="true"></many-to-one>
</class>
</hibernate-mapping>
HibernateUtil类
public class HibernateUtil {
private static Configuration cfg=null;
private static SessionFactory factory=null;
private static Session session=null;
static{
cfg=new Configuration().configure();
factory=cfg.buildSessionFactory(new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build());
}
public static Session getSession(){
if(factory!=null)
return factory.openSession();
factory=cfg.buildSessionFactory(new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build());
return factory.openSession();
}
public static void closeSession(){
if(session!=null && session.isOpen())
session.close();
}
}
测试类,使用Junit4进行测试
public class HibernateTest {
@Test
public void testCreateDB(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中
se.create(true, true);
}
/**
* 保存数据
*/
@Test
public void save(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Grade grade=new Grade();
grade.setName("大一");
session.save(grade);
Student stu=new Student();
stu.setName("张三");
stu.setAge(20);
stu.setGrade(grade);
session.save(stu);
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
}
执行testCreateDB会在数据库创建student和grade两张表,控制台会打印如下信息:
执行save会在两张表中插入数据,控制台打印结果如下:
数据库grade和student表信息如下: