• Hibernate对象标识符


    Hibernate提供的内置标识符生成器

      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录。Hibernate使用OID(对象标识符)来统一两者之间的矛盾,OID是关系数据库中的主键(通常称为代理主健)在Java对象模型中的等价物。

    在对象-关系映射文件中,<id>元素用来设置对象标识符,比如:
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
              <generator class="identity" />
            </id>
    <generator>元素用来设定标识生成器。Hibernate提供了标识符生成器接口: org.hibernate.id.IdentifierGenerator接口;并且提供了多种内置的实现。例如: org.hibernate.id.IdentityGenerator;org.hibernate.id.IncrementGenerator;它们的缩写名分别为:identity和increment。在设置<generator>子元素的class属性时,既可以提供完整的标识符生成器的类名,也可以给定缩写名,因此以下两种方式是等价的。

            <id name="id" type="java.lang.Integer">

                <column name="ID" />

                <generator class="org.hibernate.id.IdentityGenerator" />

            </id>

    或者:

            <id name="id" type="java.lang.Integer">
                <column name="ID" />
              <generator class="identity" />
            </id>


     

    标识符生成器

             

    increment  

        适用于代理主键。由Hibernate自动以递增的方式生成标识符,每次增加1。
    优点:由于它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。
    缺点:只适合有单个Hibernate应用进程访问同一个数据库,在集群环境下不推荐使用它。 另外,OID必须为long,int,short类型,如果为byte类型,则会有异常。

    identity 

    适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型。(oracle数据库不能用它)

    sequence

    适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列。(oracle数据库能用它)

    hilo 

    适用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为"high"值.在默认情况下选用hibernate_unique_key表的next_hi字段。它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。high/low算法生成的标识符只能在一个数据库中保证唯一。

    native

    适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence, hilo。很适合于跨平台开发,即同一个Hibernate应用需要连接多种数据库系统。

    uuid.hex

    适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。UUID算法能够在网络环境中生成唯一的字符串标识符。这种标识符生成策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。

    assigned

    适用于自然主键。由Java应用程序负责生成标识符,为了能让Java应用程序设置OID,不能把setID()方法声明为private类型,应该尽量避免使用自然主键。


    代理主键:

         注意: 不具有义务含义,所以它可以适应不断变化的业务需求,它通常为整数类型,比如short、long、int,以及它们的包装类型。

    自然主键:

       具有业务含义。

    几种常用数据库系统中可使用的标识符生成器:

    MYSQL:identity、increment、hiho、native

    MS SQL Serveridentity、increment、hiho、native

    Oraclesequence、identity、increment、hiho、native

    跨平台开发:native


     几个例子:

    1、如果主键字段为自增类型,
    那么对应的.hbm.xml文件中的id字段的xml声明,
    应该这么写:
    <generator class="native" />
    例如:
    <id
    column="user_id"
    name="Id"
    type="integer"
    >
    <generator class="native" />
    </id>
    其实这个native并非实际的类型,而是hiberante根据
    当前使用的数据库,自动使用对应的类型。
    例如:如果sqlserver,native就对应identity
    见Hiberante参考:
    native(本地)
    根据底层数据库的能力选择identity, sequence 或者hilo中的一个。


    2、如果主键字段不设置为自增,但是int型的
    可以使用increment,由hibernate产生主键。
    <generator class="increment" />
    不过这种方法,对于并发量大的应用,似乎最好不要采用。
    见hiberante参考:
    increment(递增)
    用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 
    在集群下不要使用。


    3、如果使用uuid.hex产生的随机32位数最为主键
    那么数据库的id字段类型为char,长度为32
    hbm.xml中写为: <generator class="uuid.hex" />
    另外,uuid.string也是功能类似。
    uuid.hex产生的是32位的16进制数字的字符串。
    而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
    见参考:
    uuid.hex
    用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。 
    uuid.string
    使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中

  • 相关阅读:
    I B
    让Xcode的控制台支持LLDB类型的打印
    UINavigationController和UIScrollView一起使用时导致UIScrollView位置偏移
    C语言中如何用printf函数输出百分号?
    运算符的优先级
    How To Ask Question The Smart Way
    WEB浅析(本人小白~)
    博客园的基础设置
    静态页面和动态页面的区别
    <存储小结>(待补充)
  • 原文地址:https://www.cnblogs.com/superws/p/5832057.html
Copyright © 2020-2023  润新知