Hibernate框架二之ManyToOne

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没有关闭的时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值