zoukankan      html  css  js  c++  java
  • 3hibernate核心对象关系映射 xxx.hbm.xml

    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+~)反引号,不然就要改列名;
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
    <!-- 
        第一部分:映射文件:映射一个实体类对象,用来描述一个对象最终实现可以直接保存对象数据到数据库中
        package(可选):要映射的对象即实体类所在的包,如果不指定package,那么下面所有的类都要指定全路径        
     -->    
    <hibernate-mapping package="com.bie.po"> 
        <!-- 操作条件:(1):对象与表/(2):属性与字段的对应/(3):类型的对应,类型默认采用属性的类型,type不写的话
         -->
         
        <!-- 第二部分:
            (1):class:映射某一个对象的(一般情况下,一个对象写一个映射文件,即一个class节点); 
                  name:指定要映射的对象的类型,实体类名称;
                  table:指定要映射的表,表名称;
            (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方式;
                 -->
            (3):普通字段映射:property
                name:指定对象的属性名称;
                column:指定对象属性对应的表的字段名称,如果不写默认与对象属性一致 ;    
                length:用于指定字符类型长度,比如字符串类型varchar(20),默认长度255;
                type:用于指定表的字段的类型,如果不指定,会匹配属性的类型,包含两种类型;
                    java类型:必须写全名,比如java.lang.String,java.util.Date
                    hibernate类型:比如string,date,都是小写,不能写String(不能首字母大写)
                    注意:desc关键字,可以使用``(不是shift+~是直接~键)反引号或者改列名
        -->
        <class name="User" table="user">
            <!-- 主键,映射 -->
            <id name="id" column="id">
                <generator class="native"></generator>
            </id>
            
            <!-- 非主键,映射 -->
           <!-- 
                非主键映射,普通字段的映射
                name:字段的属性名称,其他字段可以不写;
                column:对应的数据表的字段名称;
                length:自定字符类型的长度,只能指定字符类型的,如果不指定,默认为255;
                type:指定数据表的字段的类型,如果不指定会匹配属性的类型:
                    java类型:必须写全名,如java.lang.String;
                    hibernate类型:string类型;直接写类型,都是小写
              -->
            <property name="name" column="name"></property>
            <property name="password" column="password"></property>
            <property name="email" column="email"></property>
            <property name="phone" column="phone"></property>
            
            
        </class>
    
    </hibernate-mapping>
  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/lukelook/p/9675968.html
Copyright © 2011-2022 走看看