zoukankan      html  css  js  c++  java
  • Hibernate——主键配置

    <id>元素中的<generator>用来为该持久化类的实例生成唯一的标识,hibernate提供了很多内置的实现。
    Increment:由hibernate自动递增生成标识符,用于为long, short或者int类型生成唯一标识。如DB2、SQL Server、MySQL 中的主键生成机制。 这种方式可能产生的问题是:不能在集群下使用
    identity :由底层数据库生成标识符(自动增长),返回的标识符是 long, short 或者int类型的。
    sequence :根据底层数据库序列生成标识符,返回的标识符 是long, short或者 int类型的。如Oralce中的Sequence。?
    hilo :使用一个高/低位算法来高效的生成long, short 或者int类型的标识符,需要额外的数据库表或字段提供高位值来源。
    seqhilo:与hilo类似,通过hi/lo算法实现的主键生成机制,需要数据库中的Sequence,适用于支持Sequence的数据库,如Oracle。?
    uuid.hex :用一个128-bit的UUID算法生成32位字符串类型的标识符。
    uuid.string:与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在PostgreSQL数据库中。
    native :根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
    assigned :主键由外部程序负责生成,让应用程序在save()之前为对象分配一个标示符。
    foreign :使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。

    一、id生成方式
    1,序列sequence 只适用于Oracle
    <id name="id" column="id">
    <generator class="sequence">
    <param name="sequence">person_seq</param><!--指定sequence名-->
    </generator>
    </id>
    2,自增列,适用于SQLServer、MySql
    <id name="id" column="id">
    <generator class="identity"/>
    </id>
    3,取最大值加一
    <id name="id" column="id" type="integer">
    <generator class="increment"/>
    </id>
    4,根据底层数据库指定生成方法
    <id name="id" column="id">
    <generator class="native"/>
    </id>
    使用缺省策略
    针对Oracle数据库的生成方式还是sequence,只不过需要一个特定名字的sequence,"hibernate_sequence"。
    5,高低位算法
    <id name="id" column="id">
    <generator class="hilo">
    <param name="table">high_value</param>
    <!--设置高位值取值的表-->
    <param name="column">next_value</param>
    <!--设置高位值取值的字段-->
    <param name="max_lo">50</param>
    <!--指定低位最大值,当取道最大值是会再取一个高位值再运算-->
    </generator>
    </id>
    以上是hilo算法的普通形式,不适合用于squenece
    在一个会话中保存多个对象

    二、Hibernate中对类关系的处理:
    one―to―one关系在数据库中如何体现,在JavaBean中如何体现,在
    Hibernate中如何映射one-to-one关系。
    1、 数据库中:一个表的外健对应另一个表的主健,外健要加上Unique约束(外健关联)。或者是两个表共享一个主健,表现为子表中的pk同时引用了父表的pk作外健而存在(主健关联,子表中的pk和fk为一个字段)。
    2、 javaBean中:在JavaBean中增加一个属性,即另外一个对象的引用,可以单向也可以双向。
    3、 在hibernate中:
    A、主健映射:都是one-to-one要用foreign生成策略。
    以汽车car和发动机Engine(一对一关系)为例:
    a、主表Car.hbm.xml的写法
    <class name="Car" table="car_pk">
    <id name="id" column="id" type="integer">
    <generator class="native" />
    </id>
    <property name="name" column="name" type="string" />
    <one-to-one name="engine" class="Engine" cascade="all"/>
    </class>
    注:cascade="all" 表示增删改查Car对象时都会级联增加、删除和修改Engine对象。
    级联一定是在主对象的映射文件中
    b、附表Engine.hbm.xml的写法
    <class name="Engine" table="engine_pk">
    <id name="id" column="id" type="integer">
    <generator class="foreign">
    <param name="property">car</param>
    </generator>
    </id>
    <property name="model" column="model" type="string" />
    <one-to-one name="car" class="Car" c/>
    </class>
    注:c表示Engine应用了Car的主健作为外健。
    foregin表明id的生成方式是引用表car的主键
    B、外健映射:主表中用one-to-one,通过property -ref many-to-one
    a、主表Car.hbm.xml的写法
    <class name="Car" table="car_fk">
    <id name="id" column="id" type="integer">
    <generator class="native" />
    </id>
    <property name="name" column="name" type="string" />
    <one-to-one name="engine" class="Engine"
    property-ref="car" cascade="save-update"/>
    </class>
    注:name="engine" property-ref="car"表示engine表引用了car表的主健作为他的外健。
    cascade="save-update"表示增改Car对象时都会级联增加和修改Engine对象。
    b、附表Engine.hbm.xml的写法
    <class name="Engine" table="engine_fk">
    <id name="id" column="id" type="integer">
    <generator class="native" />
    </id>
    <property name="model" column="model" type="string" />
    <many-to-one name="car" class="Car"
    unique="ture" column="carid"/>
    </class>
    注:unique="ture" column="carid"表示为engine表中的外健carid加上唯一约束,使之一对多关系强制转化为一对一关系。

  • 相关阅读:
    matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
    Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
    机器学习基石笔记1——在何时可以使用机器学习(1)
    Coursera 机器学习 第9章(上) Anomaly Detection 学习笔记
    matlab安装过程的被要求的配置程序
    jdk环境变量配置
    Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
    Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记
    Coursera 机器学习 第7章 Support Vector Machines 学习笔记
    linux服务器---squid限制
  • 原文地址:https://www.cnblogs.com/Defry/p/4458696.html
Copyright © 2011-2022 走看看