zoukankan      html  css  js  c++  java
  • [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

    内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

    本人互联网技术爱好者,互联网技术发烧友

    微博:伊直都在0221

    QQ:951226918

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.基于主键映射的 1-1  

      1)基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的哪个属性作为 “对方

        

     1 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one">
     2 
     3     <class name="Department" table="DEPARTMENT">
     4     
     5         <id name="deptId" type="java.lang.Integer">
     6             <column name="DEPT_ID" />
     7             <generator class="foreign">
     8                 <param name="property">mgr</param>
     9             </generator>
    10         </id>
    11         
    12         <property name="deptName" type="java.lang.String">
    13             <column name="DEPT_NAME" />
    14         </property>
    15         
    16         
    17         <one-to-one name="mgr" class="Manager" constrained="true"></one-to-one>
    18        
    19         
    20     </class>
    21     
    22 </hibernate-mapping>

      

      2)采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应增加 constrained=“true” 属性;另一端增加one-to-one元素映射关联属性。

      

     1 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one">
     2     <class name="Manager" table="MANAGER">
     3     
     4         <id name="mgrId" type="java.lang.Integer">
     5             <column name="MGR_ID" />
     6             <generator class="native" />
     7         </id>
     8         
     9         <property name="mgrName" type="java.lang.String">
    10             <column name="MGR_NAME" />
    11         </property>
    12         
    13         <one-to-one name="dept" class="Department"></one-to-one>
    14        
    15     </class>
    16     
    17 </hibernate-mapping>

      3)constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键

    2.代码

    Department

     1 package com.jason.hibernate.entities.foreign.one2one;
     2 
     3 public class Department {
     4     private Integer deptId;
     5     private String deptName;
     6 
     7     private Manager mgr;
     8 
     9     public Integer getDeptId() {
    10         return deptId;
    11     }
    12 
    13     public void setDeptId(Integer deptId) {
    14         this.deptId = deptId;
    15     }
    16 
    17     public String getDeptName() {
    18         return deptName;
    19     }
    20 
    21     public void setDeptName(String deptName) {
    22         this.deptName = deptName;
    23     }
    24 
    25     public Manager getMgr() {
    26         return mgr;
    27     }
    28 
    29     public void setMgr(Manager mgr) {
    30         this.mgr = mgr;
    31     }
    32 
    33 }

    Manager

     1 package com.jason.hibernate.entities.foreign.one2one;
     2 
     3 public class Manager {
     4 
     5     private Integer mgrId;
     6     private String mgrName;
     7     private Department dept;
     8 
     9     public Integer getMgrId() {
    10         return mgrId;
    11     }
    12 
    13     public void setMgrId(Integer mgrId) {
    14         this.mgrId = mgrId;
    15     }
    16 
    17     public String getMgrName() {
    18         return mgrName;
    19     }
    20 
    21     public void setMgrName(String mgrName) {
    22         this.mgrName = mgrName;
    23     }
    24 
    25     public Department getDept() {
    26         return dept;
    27     }
    28 
    29     public void setDept(Department dept) {
    30         this.dept = dept;
    31     }
    32 
    33 }

    Department.hbm.xml

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <!-- Generated 2016-10-5 22:31:35 by Hibernate Tools 3.4.0.CR1 -->
     5 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one">
     6 
     7     <class name="Department" table="DEPARTMENT">
     8     
     9         <id name="deptId" type="java.lang.Integer">
    10             <column name="DEPT_ID" />
    11             <generator class="foreign">
    12                 <param name="property">mgr</param>
    13             </generator>
    14         </id>
    15         
    16         <property name="deptName" type="java.lang.String">
    17             <column name="DEPT_NAME" />
    18         </property>
    19         
    20         
    21         <one-to-one name="mgr" class="Manager" constrained="true"></one-to-one>
    22        
    23         
    24     </class>
    25     
    26 </hibernate-mapping>

    Manager.hbm.xml

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <!-- Generated 2016-10-5 22:31:35 by Hibernate Tools 3.4.0.CR1 -->
     5 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one">
     6     <class name="Manager" table="MANAGER">
     7     
     8         <id name="mgrId" type="java.lang.Integer">
     9             <column name="MGR_ID" />
    10             <generator class="native" />
    11         </id>
    12         
    13         <property name="mgrName" type="java.lang.String">
    14             <column name="MGR_NAME" />
    15         </property>
    16         
    17         <one-to-one name="dept" class="Department"></one-to-one>
    18        
    19     </class>
    20     
    21 </hibernate-mapping>

    hibernate.cfg.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     5 <hibernate-configuration>
     6     <session-factory>
     7         <!-- hibernate 连接数据库的基本信息 -->
     8         <property name="connection.username">root</property>
     9         <property name="connection.password">zhangzhen</property>
    10         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    11         <property name="connection.url">jdbc:mysql:///hibernate</property>
    12         
    13         
    14         <!-- 配置hibernate 的节本信息 -->
    15         <!-- hibernate 所使用的数据库方言 -->
    16         <!--<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>-->
    17    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
    18         <!-- 执行操作时是否在控制台打印SQL  -->
    19         <property name="show_sql">true</property>
    20         
    21         <!-- 是否都SQL 进行格式化 -->
    22         <property name="format_sql">true</property>
    23         
    24         
    25         <!-- 指定自动生成数据表的策略 -->
    26         <property name="hbm2ddl.auto">update</property>
    27         
    28         <!-- 设置hibernate 的事务隔离级别 -->
    29         <property name="connection.isolation">2</property>
    30         
    31         
    32         <!-- 配置c3p0 -->
    33         <property name="hibernate.c3p0.max_size">10</property>
    34         <property name="hibernate.c3p0.min_size">5</property>
    35         <property name="c3p0.acquire_increment">2</property>
    36         <property name="c3p0.idle_test_period">2000</property>
    37         <property name="c3p0.timeout">2000</property>
    38         <property name="c3p0.max_statements">10</property>
    39         
    40         
    41         <!-- 对于mysql 无效,对于oracle 有效 -->
    42         <!-- 设定JDBC 的Statement 读取数据的时候每次从数据库中取出的记录的条数 -->
    43         <property name="hibernate.jdbc.fetch_size">100</property>
    44         
    45         <!-- 设置数据库进行批量删除,批量更新和批量插入的时候的大小 -->
    46         <property name="hibernate.jdbc.batch_size">30</property>
    47         
    48         <!-- 指定关联的 .hbm.xml 文件 -->
    49         <!-- 
    50             <mapping resource="hibernate/helloworld/News.hbm.xml"/>
    51             <mapping resource="hibernate/helloworld/Worker.hbm.xml"/>
    52         
    53             <mapping resource="com/jason/hibernate/entities/n21/Customer.hbm.xml"/>
    54             <mapping resource="com/jason/hibernate/entities/n21/Order.hbm.xml"/>
    55         -->
    56         
    57          <mapping resource="com/jason/hibernate/entities/n21/both/Customer.hbm.xml"/>       
    58          <mapping resource="com/jason/hibernate/entities/n21/both/Order.hbm.xml"/>       
    59         
    60         
    61         <!-- 1-1 映射 -->
    62         <!-- 基于外键实现 -->
    63         <!-- <mapping resource="com/jason/hibernate/entities/foreign/one2one/Manager.hbm.xml"/>
    64         <mapping resource="com/jason/hibernate/entities/foreign/one2one/Department.hbm.xml"/>
    65          -->
    66         <!-- 基于主键实现 -->
    67         <mapping resource="com/jason/hibernate/entities/primary/one2one/Manager.hbm.xml"/>
    68         <mapping resource="com/jason/hibernate/entities/primary/one2one/Department.hbm.xml"/>
    69         
    70         
    71     </session-factory>
    72     
    73 </hibernate-configuration>

    HibernateTest.java

      1 package com.jason.hibernate.entities.foreign.one2one;
      2 
      3 import hibernate.helloworld.News;
      4 
      5 import java.util.Date;
      6 
      7 import org.hibernate.Hibernate;
      8 import org.hibernate.Session;
      9 import org.hibernate.SessionFactory;
     10 import org.hibernate.Transaction;
     11 import org.hibernate.cfg.Configuration;
     12 import org.hibernate.service.ServiceRegistry;
     13 import org.hibernate.service.ServiceRegistryBuilder;
     14 import org.junit.After;
     15 import org.junit.Before;
     16 import org.junit.Test;
     17 
     18 public class HibernateTest {
     19 
     20     private SessionFactory sessionFactory;
     21     private Session session;
     22     private Transaction transaction;
     23     @Test
     24     public void test() {
     25 
     26         // 1. 创建一个SessionFatory 对象
     27         SessionFactory sessionFactory = null;
     28 
     29         // 1) 创建Configuration 对象:对应hibernate 的基本配置信息 和 对象关系映射信息
     30         Configuration configuration = new Configuration().configure();
     31 
     32         // 2) 创建一个ServiceRegistry 对象:hibernate 4.x 新天添加的对象。
     33         // hibernate 的任何配置 和 服务都需要在该对象中注册后才有效
     34         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
     35                 .applySettings(configuration.getProperties())
     36                 .buildServiceRegistry();
     37 
     38         // sessionFactory = configuration.buildSessionFactory();
     39         sessionFactory = configuration.buildSessionFactory(serviceRegistry);
     40 
     41         // 2. 创建一个session 对象
     42         Session session = sessionFactory.openSession();
     43 
     44         // 3. 开启事物
     45         Transaction transaction = session.beginTransaction();
     46 
     47         // 4.执行保存操作
     48         News news = new News("java", "jason", new Date(
     49                 new java.util.Date().getTime()));
     50         session.save(news);
     51 
     52         // 5.提交事物
     53         transaction.commit();
     54         // 6.关闭session
     55         session.close();
     56         // 7.关闭SessionFactory 对象
     57         sessionFactory.close();
     58     }
     59 
     60     // 创建上述三个对象
     61     @Before
     62     public void init() {
     63         Configuration configuration = new Configuration().configure();
     64         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
     65                 .applySettings(configuration.getProperties())
     66                 .buildServiceRegistry();
     67 
     68         sessionFactory = configuration.buildSessionFactory(serviceRegistry);
     69 
     70         session = sessionFactory.openSession();
     71 
     72         transaction = session.beginTransaction();
     73     }
     74 
     75     // 关闭上述三个对象
     76     @After
     77     public void destroy() {
     78         transaction.commit();
     79         session.close();
     80         sessionFactory.close();
     81     }
     82 
     83     
     84     @Test
     85     public void testSave(){
     86         
     87         Department department = new Department();
     88         department.setDeptName("DEPT-BB");
     89         
     90         Manager manager = new Manager();
     91         manager.setMgrName("MGR-BB");
     92         
     93         
     94         //设定关联关系
     95         department.setMgr(manager);
     96         manager.setDept(department);
     97         
     98         //保存
     99         //建议先保存没有外键列的那个对象,这样会减少update 语句
    100         session.save(manager);
    101         session.save(department);
    102         
    103         
    104     }
    105     
    106     @Test
    107     public void testGet(){
    108         
    109         //1.默认情况下对关联属性使用懒加载
    110         Department dept = (Department) session.get(Department.class, 1);
    111         System.out.println(dept.getDeptName());
    112         
    113         
    114         //2.查询Manager 对象的连接条件应该是dept.manager_id = mgr.manager_id
    115         //而不因该是  manager0_.MGR_ID=department1_.DEPT_ID 
    116         Manager mgr = dept.getMgr();
    117         System.out.println(mgr);
    118     }
    119     
    120     
    121     @Test
    122     public void testGet2(){
    123         
    124         //在查询没有外键的实体对象,使用的是左外连接查询,一并查询出其关联的对象,并已经进行初始化
    125         Manager manager = (Manager) session.get(Manager.class, 1);
    126         System.out.println(manager);
    127         
    128         System.out.println(manager.getDept().getDeptName());
    129         
    130     }
    131     
    132     
    133     
    134     
    135 }
  • 相关阅读:
    BGP的属性与配置
    IS-IS协议的简单设置
    ospf中建立虚链路、ospf与rip的重分发 stup与nssa区域的建立
    静态路由 默认路由 浮动路由配置
    centos7防火墙机制iptables与ebtables差别
    centos7虚拟机qemu学习
    centos7安装vncserver(windows控制其图形化界面)
    centos7虚拟机扩容
    centos7安装graylog
    centos7修改网卡
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5933270.html
Copyright © 2011-2022 走看看