hibernate多对一关联映射

 1.建立Java工程项目hibenate_many2one,添加hibernate所需的Jar包和mysql驱动Jar包。

2.建立工具类HibernateUtils.java和ExportDB.java,代码如下:

    HibernateUtils.java

 

  1. package com.i51pro.hibernate;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. public class HibernateUtils {
  6.     private static SessionFactory sessionFactory;
  7.     static {
  8.         try {
  9.             Configuration cfg = new Configuration().configure();
  10.             sessionFactory = cfg.buildSessionFactory();
  11.         } catch (Exception e) {
  12.             e.printStackTrace();
  13.         }
  14.     }
  15.     public static SessionFactory getSessionFactory() {
  16.         return sessionFactory;
  17.     }
  18.     public static Session getSession() {
  19.         return sessionFactory.openSession();
  20.     }
  21.     public static void closeSession(Session session) {
  22.         if (session != null) {
  23.             if (session.isOpen()) {
  24.                 session.close();
  25.             }
  26.         }
  27.     }
  28. }

ExportDB.java

  1. package com.i51pro.hibernate;
  2. import org.hibernate.cfg.Configuration;
  3. import org.hibernate.tool.hbm2ddl.SchemaExport;
  4. public class ExportDB {
  5.     /**
  6.      * @param args
  7.      */
  8.     public static void main(String[] args) {
  9.         Configuration cfg = new Configuration().configure();
  10.         
  11.         SchemaExport export = new SchemaExport(cfg);
  12.         export.create(truetrue);
  13.     }
  14. }

 

3.下面编写实体类和映射文件:

    Group.java

  1. package com.i51pro.hibernate;
  2. public class Group {
  3.     private int id;
  4.     
  5.     private String name;
  6.     public int getId() {
  7.         return id;
  8.     }
  9.     public void setId(int id) {
  10.         this.id = id;
  11.     }
  12.     public String getName() {
  13.         return name;
  14.     }
  15.     public void setName(String name) {
  16.         this.name = name;
  17.     }
  18. }   

 User.java

  1. package com.i51pro.hibernate;
  2. public class User {
  3.     private int id;
  4.     
  5.     private String name;
  6.     private Group group;
  7.     
  8.     public int getId() {
  9.         return id;
  10.     }
  11.     public void setId(int id) {
  12.         this.id = id;
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.     public Group getGroup() {
  21.         return group;
  22.     }
  23.     public void setGroup(Group group) {
  24.         this.group = group;
  25.     }
  26. }

    Group.htm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC 
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <class name="com.i51pro.hibernate.Group" table="t_group">
  7.         <id name="id">
  8.             <generator class="native"/>
  9.         </id>
  10.         <property name="name"/>
  11.     </class>
  12. </hibernate-mapping>

    User.html.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC 
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <class name="com.i51pro.hibernate.User" table="t_user">
  7.         <id name="id">
  8.             <generator class="native"/>
  9.         </id>
  10.         <property name="name"/>
  11.         <many-to-one name="group" column="groupid" cascade="all" />
  12.     </class>
  13. </hibernate-mapping>

4.最后编写Hibernate映射文件:

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5.     <session-factory>
  6.         <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_many2one</property>
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8.         <property name="hibernate.connection.username">root</property>
  9.         <property name="hibernate.connection.password">admin</property>
  10.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  11.         <property name="hibernate.show_sql">true</property>
  12.         
  13.         <mapping resource="com/i51pro/hibernate/User.hbm.xml"/>
  14.         <mapping resource="com/i51pro/hibernate/Group.hbm.xml"/>
  15.     </session-factory>
  16. </hibernate-configuration>

5.在项目hibernate_many2one下新建SourceFolder,命名为test,在该包下新建测试类Many2OneTest进行单元测试,,它的代码如下:

    Many2OneTest

  1. package com.i51pro.hibernate;
  2. import org.hibernate.Session;
  3. import junit.framework.TestCase;
  4. public class Many2OneTest extends TestCase {
  5.     public void testSave1() {
  6.         Session session = null;
  7.         try {
  8.             session = HibernateUtils.getSession();
  9.             session.beginTransaction();
  10.             
  11.             Group group = new Group();
  12.             group.setName("JAVA开发小组");
  13.             
  14.             User user1 = new User();
  15.             user1.setName("成员一");
  16.             user1.setGroup(group);
  17.             
  18.             User user2 = new User();
  19.             user2.setName("成员二");
  20.             user2.setGroup(group);
  21.             
  22.             //不能成功保存,抛出TransientObjectException异常
  23.             //因为Group为Tran  sient状态,oid没有分配值
  24.             //persistent状态的对象是不能引用transient状态的对象的
  25.             session.save(user1);
  26.             session.save(user2);
  27.             session.getTransaction().commit();
  28.         }catch(Exception e) {
  29.             e.printStackTrace();
  30.             session.getTransaction().rollback();
  31.         }finally {
  32.             HibernateUtils.closeSession(session);
  33.         }
  34.     }   
  35.     
  36.     public void testSave2() {
  37.         Session session = null;
  38.         try {
  39.             session = HibernateUtils.getSession();
  40.             session.beginTransaction();
  41.             
  42.             Group group = new Group();
  43.             group.setName("JAVA开发小组");
  44.             
  45.             session.save(group);
  46.             
  47.             User user1 = new User();
  48.             user1.setName("成员一");
  49.             user1.setGroup(group);
  50.             
  51.             User user2 = new User();
  52.             user2.setName("成员二");
  53.             user2.setGroup(group);
  54.             
  55.             //可以正确存储
  56.             session.save(user1);
  57.             session.save(user2);
  58.             session.getTransaction().commit();
  59.         }catch(Exception e) {
  60.             e.printStackTrace();
  61.             session.getTransaction().rollback();
  62.         }finally {
  63.             HibernateUtils.closeSession(session);
  64.         }
  65.     }   
  66.     
  67.     public void testSave3() {
  68.         Session session = null;
  69.         try {
  70.             session = HibernateUtils.getSession();
  71.             session.beginTransaction();
  72.             
  73.             Group group = new Group();
  74.             group.setName("JAVA开发小组");
  75.             
  76.             User user1 = new User();
  77.             user1.setName("成员一");
  78.             user1.setGroup(group);
  79.             
  80.             User user2 = new User();
  81.             user2.setName("成员二");
  82.             user2.setGroup(group);
  83.             
  84.             //不会抛出异常,因为采用了cascade属性,所以它会先保存Group
  85.             //采用cascade属性是解决TransientObjectException异常的一种手段         
  86.             session.save(user1);
  87.             session.save(user2);
  88.             session.getTransaction().commit();
  89.         }catch(Exception e) {
  90.             e.printStackTrace();
  91.             session.getTransaction().rollback();
  92.         }finally {
  93.             HibernateUtils.closeSession(session);
  94.         }
  95.     }   
  96.     
  97.     public void testLoad1() {
  98.         Session session = null;
  99.         try {
  100.             session = HibernateUtils.getSession();
  101.             session.beginTransaction();
  102.             User user = (User)session.load(User.class3);
  103.             System.out.println("user.name=" + user.getName());
  104.             System.out.println("user.group.name=" + user.getGroup().getName());
  105.             
  106.             session.getTransaction().commit();
  107.         }catch(Exception e) {
  108.             e.printStackTrace();
  109.             session.getTransaction().rollback();
  110.         }finally {
  111.             HibernateUtils.closeSession(session);
  112.         }
  113.     }   
  114. }

 

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

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

<many-to-one>标签的定义示例:
  * <many-to-one name="group" column="groupid"/>
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值