zoukankan      html  css  js  c++  java
  • Hibernate映射配置方法

    *************************Hibernate基本映射

        hibernate通过映射文件知道如何加载(load)和存储(store)持久化类的对象,映射文件告诉hibernate应该访问数据库(database)里面的哪张表(table)及应该使用表里面的哪些字段(column).

    实体类-----表 ,采用<class>标签映射;

    实体类中的普通属性(不包括集合、自定义类和数组)---表字段,采用<property>标签映射

    注意:如果实体类的名称或实体类中属性名称与数据库关键字重复,将会出现问题

    可以考虑采用table属性和column属性对其进行得新命名

    实体类的设计原则:

    *实现无参的默认的构造函数

    *提供一个标识

    *建议不要用fianl修饰实体类

    *建议为实体类生成getter和setter方法

    映射文件重要标签:

    1.<DOCTYPE>

    image

    2.<hibernate-mapping>

    image

    3.<class>

    image

    image

    image

    4.<id>

    image

    5.<Generator>

         可选的<generator>子元素是一个Java类的名,用来为该持久类的实例生成唯一的标识.如果这个生成器实例需要某些配置值或者初始化参数,用<param>元素.

    image

    所有的生成器都实现org.hibernate.id.IdentifierGenerator接口,某些应用程序可以选择提供他们自己特定的实现.当然,Hibernate提供了很多内置的实现.下面是一些内置生成器的快捷名字:

    image

    image

    主要了解以下生成策略:

        *identity

        *sequence

        *uuid

        *native

        *assigned

        *foreign

    6.<composite_id>

    image

    7.<discriminator>

    image

    8.<property>

    image

    ************************************关联映射

    01.多对一单向映射(User<--Group)
    02.多对多双向映射(User<-- Role)
    03.多对多单向映射(User<--Role)

    04.一对一主键双向(Person--> IdCard)
    05.一对一主键单向(Person--> IdCard)

    06.一对一外键单向(Person--> IdCard)
    07.一对一外键双向(Person<--> IdCard)
    08.一对多单向(Group--> User)
    09.一对多双向(Group<—> User)

    10.继承映射(Pig和Bird 继承Animal)
        --一棵继承树映射成一张表

    11.继承映射(Pig和Bird 继承Animal)

        --一每个具体类映射成一张表joined-classs

    12.继承映射(Pig和Bird 继承Animal)

        --一每个子类类映射成一张表union-subclass

    13. component映射

    14. Set,Map,Arrary[],List映射

    ************************************

    1.多对一单向映射(User- ->Group)
    【Group.hbm.xml文件如下:】
    <hibernate-mapping>
              <class name="com.dragon.hibernate.Group" table="t_group">
                       <id name="id">
                            <generator class="native"/>
                      </id>
                      <property name="name"/>
               </class>
    </hibernate-mapping>
    【User.hbm.xml文件如下:】
    <hibernate-mapping>
             <class name="com.dragon.hibernate.User" table="t_user">
                     <id name="id">
                         <generator class="native"/>
                     </id>
                     <property name="name"/>
                     <many-to-one name="group" column="groupid"/>
              </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    2.多对多双向映射(User<- -Role)
    【User.hbm.xml文件如下】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.User" table="t_user">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="roles" table="t_user_role">
    <key column="userid"/>
    <many-to-many class="com.dragon.hibernate.Role" column="roleid"/>
    </set>
    </class>
    </hibernate-mapping>
    【Role.hbm.xml文件如下】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.Role" table="t_role">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="users" table="t_user_role">
    <key column="roleid"/>
    <many-to-many class="com.dragon.hibernate.User" column="userid"/>
    </set>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    3.多对多单向映射(User<--Role)
    在User端使用set 引用role 维持关系,则User.hbm.xml文件同上面的双向一样,只有Role.hbm.xml文件稍微有所小小的不同,比双向更简单。
    【Role.hbm.xml文件如下】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.Role" table="t_role">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    </class>
    </hibernate-mapping>
    【User.hbm.xml文件如下】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.User" table="t_user">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="roles" table="t_user_role">
    <key column="userid"/>
    <many-to-many class="com.dragon.hibernate.Role" column="roleid"/>
    </set>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    4.一对一主键双向(Person--> IdCard)
    【Person.hbm.xml文件如下】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.Person" table="t_person">
    <id name="id">
    <generator class="foreign">
    <param name="property"> idcard</param>
    </generator>
    </id>
    <property name="name"/>
    <one-to-one name="idcard" constrained="true"/>
    </class>
    </hibernate-mapping>
    【Idcard.hbm.xml文件如下】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.IdCard" table="t_idcard">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="idno"/>
    <one-to-one name="person"></one-to-one>
    </class>
    </hibernate-mapping>
    One-to-one标签指示hibernate如何加载关联对象,默认是根据主键加载;
    constrained="true"表示当前主键存在一个约束,person的主键作为外键参照idcard。
    ---------------------------------------------------------
    5.一对一主键单向(Person--> IdCard)
    Person.hbm.xml文件如下相同
    Idcard.hbm.xml文件如下:
    <hibernate-mapping>
    <class name="com.dragon.hibernate.IdCard" table="t_idcard">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="idno"/>
    </class>
    </hibernate-mapping>
    与双向的只是少了这句<one-to-one name="person"> </one-to-one>

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

    6.一对一外键单向(Person--> IdCard)
    IdCard.hbm.xml文件如下:
    <hibernate-mapping>
    <class name="com.dragon.hibernate.IdCard" table="t_idcard">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="idno"/>
    </class>
    </hibernate-mapping>
    Person.hbm.xml文件如下:
    <hibernate-mapping>
    <class name="com.dragon.hibernate.Person" table="t_person">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <many-to-one name="idcard" column="idcardid" unique="true"/>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    7.一对一外键双向(Person<--> IdCard)
    Person.hbm.xml文件与单向一样
    IdCard.hbm.xml文件如下:
    <hibernate-mapping>
    <class name="com.dragon.hibernate.IdCard" table="t_idcard">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <one-to-one name="person" proper-ref=“idcard”/>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    8.一对多单向(Group--> User)
    注意,在key中的外键 <key column="groupid"/>要一致不然要生成中间表
    【Group.hbm.xml文件如下】
    <hibernate-mapping package="com.dragon.hibernate">
    <class name="Group" table="t_group">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="users">
    <key column="groupid"/>
    <one-to-many class="User"/>
    </set>
    </class>
    </hibernate-mapping>
    【User.hbm.xml文件如下】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.User" table="t_user">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    9.一对多双向(Group<--> User)
    【Group.hbm.xml文件如下】
    <hibernate-mapping package="com.dragon.hibernate">
    <class name="Group" table="t_group">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="users" cascade="all">
    <key column="groupid"/>
    <one-to-many class="User"/>
    </set>
    </class>
    </hibernate-mapping>
    【User.hbm.xml文件如下:】
    <hibernate-mapping>
    <class name="com.dragon.hibernate.User" table="t_user">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <many-to-one name="groups" column="groupid"/>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    10.继承映射(Pig和Bird 继承Animal)
    --一棵继承树映射成一张表--一
    extends.hbm.xml文件如下:
    <hibernate-mapping package="com.dragon.hibernate">
    <class name="Animal" table="t_extends">
    <id name="id">
    <generator class="native"/>
    </id>
    <discriminator column="type" type="string"/>
    <property name="name"/>
    <property name="sex"/>
    <subclass name="Pig" discriminator-value="P">
    <property name="weight"/>
    </subclass>
    <subclass name="Bird" discriminator-value="B">
    <property name="height"/>
    </subclass>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    11.继承映射(Pig和Bird 继承Animal)

    --一每个具体类映射成一张表joined-classs--一
    extends.hbm.xml文件如下:
    <hibernate-mapping package="com.dragon.hibernate">
    <class name="Animal" table="t_animal">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <property name="sex"/>
    <joined-subclass name="Pig" table="t_pig">
    <key column="pid"/>
    <property name="weight"> </property>
    </joined-subclass>
    <joined-subclass name="Bird" table="t_bird">
    <key column="bid"/>
    <property name="height"> </property>
    </joined-subclass>
    </class>
    </hibernate-mapping>
    ---------------------------------------------------------
    12.继承映射(Pig和Bird 继承Animal)

    --每个子类类映射成一张表union-subclass--一
    extends.hbm.xml文件如下:
    <hibernate-mapping package="com.dragon.hibernate">
    <class name="Animal" table="t_animal">
    <id name="id">
    <generator class="uuid"/>
    </id>
    <property name="name"/>
    <property name="sex"/>
    <union-subclass name="Pig" table="t_pig">
    <property name="weight"/>
    </union-subclass>
    <union-subclass name="Bird" table="t_bird">
    <property name="height"/>
    </union-subclass>
    </class>
    </hibernate-mapping>
    **注释在使用<id name="id">
    <generator class="uuid"/>
    </id> 是不能将<generator class="uuid"/> 改写成<generator class="native"/> ,不然会出错。相应的Animal类中的id字段类型也要该为String.
    如果在<class name="Animal" table="t_animal"> 中添加Abstract="true"可以使hibernate不生成表t_animal
    ---------------------------------------------------------
    13. component映射
    component.hbm.xml文件如下:
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.User" table="t_user">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <component name="contact">
    <property name="email"/>
    <property name="address"/>
    <property name="zipCode"/>
    <property name="contactTel"/>
    </component>
    </class>
    </hibernate-mapping>
    User类中有以下属性:
    private int id;
    private String name;
    private Contact contact;它不再是一种引用了
    ---------------------------------------------------------

    14. Set,Map,Arrary[],List映射

    CollectionMapping.hbm.xml文件如下:
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.CollectionMapping" table="t_CollectionMapping">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="setValue" table="t_set_value">
    <key column="set_id"/>
    <element type="string" column="set_value"/>
    </set>
    <list name="listValue" table="t_list_value">
    <key column="list_id"/>
    <list-index column="list_index"/>
    <element type="string" column="list_value"/>
    </list>
    <array name="arrayValue" table="t_array_value">
    <key column="array_id"/>
    <list-index column="array_index"/>
    <element type="string" column="array_value"/>
    </array>
    <map name="mapValue" table="t_map_value">
    <key column="map_id"/>
    <map-key type="string" column="map_key"/>
    <element type="string" column="map_value"/>
    </map>
    </class>
    </hibernate-mapping>

  • 相关阅读:
    P1587 [NOI2016]循环之美 杜教筛
    【学习笔记】省选动态规划类型选讲
    【模板】结构体重载高精度
    SP1716 GSS3
    SP1043 GSS1
    P1890 gcd区间 线段树
    【模板】(最小费用)最大流
    【模板】矩阵乘法
    P1073 最优贸易 DFS
    【2019.8.14】2019QB学堂DP图论班第一次考试 Problem C
  • 原文地址:https://www.cnblogs.com/pyrmkj/p/3332460.html
Copyright © 2011-2022 走看看