7. 多对一关联映射

来源:互联网 发布:显卡测试软件2016 编辑:程序博客网 时间:2024/06/03 23:01

关联映射的本质:

       * 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用

实例背景:

many-to-one实例类图

1. 定义Group

package com.bjsxt.hibernate;

 

public class Group {     

       private int id;  

       private String name;

 

       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;

       }

}

2. 定义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>

       <class name="com.bjsxt.hibernate.Group" table="t_group">

              <id name="id">

                     <generator class="native"/>

              </id>

              <property name="name"/>

       </class>

</hibernate-mapping>

3. 定义User

package com.bjsxt.hibernate;

 

public class User {

      

       private int id;

       private String name;

       private Group group;

 

       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 Group getGroup() {

              return group;

       }

       public void setGroup(Group group) {

              this.group = group;

       }    

}

4. 定义User类的映射文件

<?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>

       <class name="com.bjsxt.hibernate.User" table="t_user">

              <id name="id">

                     <generator class="native"/>

              </id>

              <property name="name"/>

              <!-- group是数据库的关键字,这里必须定义column属性-->

               <many-to-one name="group" column="groupid"/>

       </class>

</hibernate-mapping>

注意:<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

5. 定义hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC

       "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

 

<hibernate-configuration>

       <session-factory>

              <property name="hibernate.connection.url">

                     jdbc:mysql://localhost/hibernate_many2one

              </property>

              <property name="hibernate.connection.driver_class">

                     com.mysql.jdbc.Driver

              </property>

              <property name="hibernate.connection.username">root</property>

              <property name="hibernate.connection.password">bjsxt</property>

              <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

              <property name="hibernate.show_sql">true</property>

             

              <mapping resource="com/bjsxt/hibernate/User.hbm.xml"/>

              <mapping resource="com/bjsxt/hibernate/Group.hbm.xml"/>

       </session-factory>

</hibernate-configuration>

6. 定义ExportDB类和HibernateUtils工具类()

7. 编写测试用例

package com.bjsxt.hibernate;

 

import org.hibernate.Session

import junit.framework.TestCase;

 

public class Many2OneTest extends TestCase {

 

       public void testSave1() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Group group = new Group();

                     group.setName("尚学堂");

                    

                     User user1 = new User();

                     user1.setName("10");

                     user1.setGroup(group);

                    

                     User user2 = new User();

                     user2.setName("容祖儿");

                     user2.setGroup(group);

                    

                     //不能成功保存,抛出TransientObjectException异常

                     //因为GroupTransient状态,oid没有分配值

                     //persistent状态的对象是不能引用transient状态的对象的

                     //cascade属性可以修正这个问题

                     session.save(user1);

                     session.save(user2);

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }    

      

       public void testSave2() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Group group = new Group();

                     group.setName("尚学堂");

                    

                     session.save(group);

                    

                     User user1 = new User();

                     user1.setName("10");

                     user1.setGroup(group);

                    

                     User user2 = new User();

                     user2.setName("容祖儿");

                     user2.setGroup(group);

                    

                     //可以正确存储

                     session.save(user1);

                     session.save(user2);

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }    

      

       //可以正常加载

       public void testLoad() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                     User user = (User)session.load(User.class, 3);

                     System.out.println("user.name=" + user.getName());

                     System.out.println("user.group.name=" + user.getGroup().getName());

                    

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }           

}

8. Cascade属性

<many-to-one>标签中配置cascade属性,可以实现group对象的级联保存或修改或删除

cascade取值: none/save-update/delete/all,默认为none

修改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>

       <class name="com.bjsxt.hibernate.User" table="t_user">

              <id name="id">

                     <generator class="native"/>

              </id>

              <property name="name"/>

              <many-to-one name="group" column="groupid" cascade="all"/>

       </class>

</hibernate-mapping>

测试方法如下:

       public void testSave3() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Group group = new Group();

                     group.setName("尚学堂");

                    

                     User user1 = new User();

                     user1.setName("10");

                     user1.setGroup(group);

                    

                     User user2 = new User();

                     user2.setName("容祖儿");

                     user2.setGroup(group);

                    

                     //不会抛出异常,因为采用了cascade属性,所以它会先保存Group

                     //采用cascade属性是解决TransientObjectException异常的一种手段                

                     session.save(user1);

                     session.save(user2);

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }

 

原创粉丝点击