zoukankan      html  css  js  c++  java
  • Hibernate的核心对象关系映射

    Hibernate的核心就是对象关系映射:

    加载映射文件的两种方式:

      第一种:<mapping resource="com/bie/lesson02/crud/po/employee.hbm.xml"/>

      第二种://便于测试,会自动加载映射文件:employee.hbm.xml

           private static SessionFactory sf;
              static{
                  //加载主配置文件,并且创建session工厂
                 sf = new Configuration()
                          .configure()
                          .addClass(Employee.class)
                          .buildSessionFactory();
              }

      1:第一掌握映射文件的书写:

        <hibernate-mapping package="com.bie.po"> </hibernate-mapping>

      2:第二掌握如何映射某一个对象,以及class里面主键和普通字段的设置。

        <class name="User" table="user"></class>

        2.1:主键映射

           2.1.1:单列主键映射

    <generator class=""></generator>

      主键映射:id
                主键生成策略:
                     identity:自增长(mysql,db2)
                     native:自增长[会根据底层数据库自增长的方式选择identity或者sequence]
                             如果是mysql数据库,采用自增长的方式是identity
                             如果是oracle数据库,使用sequence序列的方式是先自增长           
                     sequence:自增长(序列),oracle中自增长是以序列方法实现
                     increment:自增长,一般不用(会有并发访问的问题,一般在服务器集群环境使用会存在问题)
                     assigned:指定主键生成策略为手动指定主键的值
                     uuid:指定uuid随机生成全球唯一的值    
                     foreign:(外键的使用,one-to-one的时候使用)         

           2.1.2:多列作为主键映射

    (1)如果找不到合适的列作为主键,除了用id列,我们一般使用联合主键,即多列的值作为一个主键,从而保证记录的唯一性。

    (2)联合主键的创建:

       create table person2(
            name VARCHAR(20),
            age INT,
            sex VARCHAR(5),
            PRIMARY key(name,age)
       )
             

    (3)创建一个实体类存放两个主键作为属性,并且实现set和get,并且必须实现可序列化;

       之后这个实体类和数据表中非两个主键的字段构成一个新的实体类,并且实现set和get方法,

       <class name="非两个主键字段创建的实体类的类名"> 

         <!-- 复合主键映射 -->
               <composite-id name="两个主键创建的实体类new的对象名称">
                     <key-property name="第一个主键的名称" type="主键字段的类型"></key-property>
                     <key-property name="第二个主键的名称" type="主键字段的类型"></key-property>
               </composite-id>

        </class>           

        2.2:普通字段映射:property
                  name:指定对象的属性名称;
                  column:指定对象属性对应的表的字段名称,如果不写默认与对象属性一致 ;    
                  length:用于指定字符类型长度,比如字符串类型varchar(20),默认长度255;
                  type:用于指定表的字段的类型,如果不指定,会匹配属性的类型,包含两种类型;
                         java类型:必须写全名,比如java.lang.String,java.util.Date
                         hibernate类型:比如string,date,都是小写,不能写String(不能首字母大写)

          注意:property的column属性的值不能是sql语句的关键字,比如desc关键字做描述的时候,如果非要使用,

                可以使用``(shift+~)反引号,不然就要改列名;

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5     
     6 <!-- 
     7     第一部分:映射文件:映射一个实体类对象,用来描述一个对象最终实现可以直接保存对象数据到数据库中
     8     package(可选):要映射的对象即实体类所在的包,如果不指定package,那么下面所有的类都要指定全路径        
     9  -->    
    10 <hibernate-mapping package="com.bie.po"> 
    11     <!-- 操作条件:(1):对象与表/(2):属性与字段的对应/(3):类型的对应,类型默认采用属性的类型,type不写的话
    12      -->
    13      
    14     <!-- 第二部分:
    15         (1):class:映射某一个对象的(一般情况下,一个对象写一个映射文件,即一个class节点); 
    16               name:指定要映射的对象的类型,实体类名称;
    17               table:指定要映射的表,表名称;
    18         (2):主键映射:id
            <!-- 主键自增的 -->
                <!--
                    主键生成策略,查看5.1.2.2.1.apiVarious additional generators
                        *identify:自增长(mysql,db2)
                        *native:自增长,会根据底层数据库自增长的方式选择identify或者sequence;
                            如果是mysql数据库,采用的是自增长方式是identify;
                            如果是oracle数据库,使用sequence序列的方式实现自增长;
                        *sequence:自增长(序列),oracle中自增长是以序列方式实现的。
                        increment:了解,自增长,会有并发访问的问题,一般在服务器集群环境使用会存在问题;
                        assigned指定主键生成策略为手动指定主键的值
                        uuid:指定uuid随机生成的序列号,唯一的值,为主键,uuid为string类型的
                        foreign:外键的方式,one-to-one方式;
                 -->
    19 (3):普通字段映射:property 20 name:指定对象的属性名称; 21 column:指定对象属性对应的表的字段名称,如果不写默认与对象属性一致 ; 22 length:用于指定字符类型长度,比如字符串类型varchar(20),默认长度255; 23 type:用于指定表的字段的类型,如果不指定,会匹配属性的类型,包含两种类型; 24 java类型:必须写全名,比如java.lang.String,java.util.Date 25 hibernate类型:比如string,date,都是小写,不能写String(不能首字母大写) 26 注意:desc关键字,可以使用``(不是shift+~是直接~键)反引号或者改列名 27 --> 28 <class name="User" table="user"> 29 <!-- 主键,映射 --> 30 <id name="id" column="id"> 31 <generator class="native"></generator> 32 </id> 33 34 <!-- 非主键,映射 -->
           <!--
                非主键映射,普通字段的映射
                name:字段的属性名称,其他字段可以不写;
                column:对应的数据表的字段名称;
                length:自定字符类型的长度,只能指定字符类型的,如果不指定,默认为255;
                type:指定数据表的字段的类型,如果不指定会匹配属性的类型:
                    java类型:必须写全名,如java.lang.String;
                    hibernate类型:string类型;直接写类型,都是小写
              --> 35 <property name="name" column="name"></property> 36 <property name="password" column="password"></property> 37 <property name="email" column="email"></property> 38 <property name="phone" column="phone"></property> 39 40 41 </class> 42 43 </hibernate-mapping>

    格力,掌握核心科技,让消费者爱上中国造!!!

    Hibernate,掌握映射核心知识,让老板给你升职加薪!!!~..~


     最后讲解一下如何查看Hibernate的api哦,很实用的哦~..~

  • 相关阅读:
    C# 中数组、ArrayList、List<T> 区别
    启动SourceNavigator出错(问题解决)
    (转)SlickEdit软件使用
    ubuntu操作记录
    ubuntu下安装Source Insight
    Android中对于没有Looper的类,要使用Toast的问题
    (转)ubuntu下安装source navigator
    (转)深入理解之 Android Handler(相当好!!!)
    Git常用命令及思维导图
    (转)android的消息处理机制(图+源码分析)——Looper,Handler,Message
  • 原文地址:https://www.cnblogs.com/biehongli/p/6532800.html
Copyright © 2011-2022 走看看