Hibernate框架二之ManyToOne

来源:互联网 发布:验证码js ajax demo 编辑:程序博客网 时间:2024/05/10 02:35

1、在开发过程中,经常会遇到:一个班级对应多个学生这种一对多的关系,hibernate作为一个持久层框架,是怎么实现这个对象的关联呢?这就是我们这章讨论的重点
2、实例代码在上面有,感兴趣的同学可以到下下来看看,这里我们主要讲解一些配置信息,代码我是配置了Group与User之间的一对多的关系,我主要讲解这个怎么配置
首先应该知道一对多的关联,关联属性应该配置在多的一方,所以这里应该讲关联属性配置在User对象中,首先看看User.hbm.xml的配置

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.xingyao.model">    <class name="User" table="t_user">        <id name="id" type="java.lang.String">            <generator class="uuid"/>        </id>        <property name="username"  type="java.lang.String"/>        <property name="password"  type="java.lang.String"/>        <property name="createTime"  type="java.util.Date"/>        <many-to-one name="group" column="group_id_fk" cascade="all" not-null="true"></many-to-one>    </class></hibernate-mapping>

这里标签就hibernate定义配置多对一的关系,其中name:User对象里面的属性值;column:是配置在该t_user表中关联t_group表主键的外键的名字;not-null:表示不能为空;重点将写cascade级联属性值的特征
引用了http://blog.csdn.net/phoenix2121/article/details/5691822这篇博客
cascade:级联操作,即你对一个对象进行操作,系统自动将该对象关联的对象也进行相同的操作
这里写图片描述

我们再来看看Group对象的配置信息,其实你会发现该配置信息和平常的病没有两样,所以就不做介绍

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.xingyao.model">    <class name="Group" table="t_group">        <id name="id" type="java.lang.Integer" column="group_id">            <generator class="native"/>        </id>        <property name="name"  type="java.lang.String"/>    </class></hibernate-mapping>

我们来看看怎么查入一个User对象信息

 @Test    public void insert() {        User user = new User();        user.setPassword("33132");        user.setUsername("243432");        Group group = new Group();        group.setId(555);        group.setName("nihao");        user.setGroup(group);        Session session = HibernateUtil.getSession();        session.beginTransaction();//      session.save(group);        session.save(user);        session.beginTransaction().commit();    }

我们看看这个程序运行会报一个异常
这里写图片描述
这个异常出现了就是因为:持久状态引用了瞬时状态的对象,所以就会报错。如果将注释移除,然后在添加就能成功;
这里讲讲hibernate对对象的管理,在hibernate框架有三种状态:瞬时状态、持久状态、游离状态
瞬时状态:指对象创建但是没有纳入session管理的对象
持久状态:指对象纳入了session管理的对象
游离状态:指对象脱离了session的管理
其中瞬时状态和游离状态由jvm管理,长期没有使用会自动被GC
那么什么时候算是纳入session管理了呢?
1、调用save(Object obj)方法,将该对象作为参数将给Session对象,但是没关闭session
2、调用update(arg0)方法,但是session没有关闭
3、调用session查询方法得到的对象,但是session没有关闭的时间
4、调用session删除方法得到的对象,但是session没有关闭的时间