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