`
学会做人
  • 浏览: 121255 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

hibernate的主键生成策略

阅读更多

Hibernate.cfg.xml配置文件:

Xml代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd">  
  3. <hibernate-configuration>  
  4.     <session-factory>  
  5.         <!-- properties -->  
  6.         <!-- jndi -->  
  7.         <property name="connection.datasource">java:comp/env/jdbc/quickstart</property>  
  8.         <property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>  
  9.         <property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>  
  10.         <!-- jdbc   
  11.         <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs</property>  
  12.         <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>  
  13.         <property name="connection.username">sa</property>  
  14.         <property name="connection.password"></property>  
  15.          -->  
  16.         <property name="jdbc.fetch_size">50</property><!-- 一次读的数据库记录数 -->  
  17.         <property name="jdbc.batch_size">30</property><!-- 设定对数据库进行批量删除 -->  
  18.         <property name="show_sql">true</property><!-- 将Hibernate发送给数据库的sql显示出来 -->  
  19.         <!-- Mapping files -->  
  20.         <mapping resource="cat.hbm.xml"/>  
  21.     </session-factory>  
  22. </hibernate-configuration>  
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- properties -->
        <!-- jndi -->
        <property name="connection.datasource">java:comp/env/jdbc/quickstart</property>
        <property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
        <property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
        <!-- jdbc
        <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs</property>
        <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
         -->
        <property name="jdbc.fetch_size">50</property><!-- 一次读的数据库记录数 -->
        <property name="jdbc.batch_size">30</property><!-- 设定对数据库进行批量删除 -->
        <property name="show_sql">true</property><!-- 将Hibernate发送给数据库的sql显示出来 -->
        <!-- Mapping files -->
        <mapping resource="cat.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 

 

数据库表主键的知识点:
Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括:

 

“assigned”
主键由外部程序负责生成,在 save() 之前指定一个。

 

“hilo”
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。

 

“seqhilo”
与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。

 

“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。

 

“identity”
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。

 

“sequence”
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。

 

“native”
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。

 

“uuid.hex”
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

 

“uuid.string”
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。

 

“foreign”
使用另外一个相关联的对象的标识符作为主键。

 

以下举例:
1、指定参数的情况:
  

Xml代码 复制代码
  1.   <id name="id" unsaved-value="0">    
  2.       <generator class="sequence">  
  3.         <param name="sequence">SEQ_CHILD</param>  
  4.       </generator>  
  5. </id>  
  <id name="id" unsaved-value="0"> 
      <generator class="sequence">
        <param name="sequence">SEQ_CHILD</param>
      </generator>
</id>

 使用的是sequence,适合oracle数据库;

 

2、对于sql server2000中的数据库子增字段,在配置文件使用下列方法实现:

Xml代码 复制代码
  1. <id name="id" type="long" unsaved-value="0">  
  2.      <column name="id" sql-type="numeric" not-null="true" />  
  3.      <generator class="identity" />    
  4. </id>  
<id name="id" type="long" unsaved-value="0">
     <column name="id" sql-type="numeric" not-null="true" />
     <generator class="identity" /> 
</id>

 
这里主要是:identity:代表由sql server2000数据库自己提供子增字段.如果要hibernate自己提供,则用increment关键字来实现

 

3、如果表中的主键用字符串类型:可以用hibernate自己提供的方法实现主键唯一:
 

Xml代码 复制代码
  1. <id name="id" type="string" unsaved-value="null">  
  2.      <column name="cid" sql-type="char(32)" not-null="true" />  
  3.      <generator class="uuid.hex" />  
  4.  </id>  
 <id name="id" type="string" unsaved-value="null">
      <column name="cid" sql-type="char(32)" not-null="true" />
      <generator class="uuid.hex" />
  </id>

 使用的是uuid.hex: 采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库。

 

重要的知识点:
1. 如果有部门表,有员工表,员工表中有dep_id,则表部门类和员工类是one-to-many的关系:
   可以使用:  ( 在部门类department中使用下列)
   Department类: 
     /**  部门的所有员工   */
    private Set staffs = new TreeSet();
   
    xml的文件:
     

Xml代码 复制代码
  1. <set name="staffs" >  
  2.          <key column="dep_id"/>  
  3.          <one-to-many class="hbp.sys.data.Staff"/>  
  4.      </set>  
 <set name="staffs" >
          <key column="dep_id"/>
          <one-to-many class="hbp.sys.data.Staff"/>
      </set>

       如果是list,需要用索引<index> </index>,具体其中的含义,不是很明白.待以后研究
     
 2. 如果部门要有一个负责人,即部门表(tb_department)中有一个字段:staff_id.
     那么表示部门和负责人之间的关系是many-to-one的关系
     Department类:
      /** 部门负责人id */
    private Staff staff;
   
    xml 文件
     

Xml代码 复制代码
  1. <many-to-one name="staff" class="hbp.sys.data.Staff"  column="staff_id"/>    
<many-to-one name="staff" class="hbp.sys.data.Staff"  column="staff_id"/>  

 
  
 3. 多对多关系,一般我们是做一个中间关联表.我用角色和权限做了个例子,
      Right(id,name)     Role(id,name)   中间表:tb_role_right(role_id,right_id)
      Right类中有一个Role的集合:private Set roles=new TreeSet();
      Role类中也有一个Right的集合:private Set rights=new TreeSet();
      则两者是明显的多对多关系.使用many-to-many来实现;
      xml文件中
      right.hbm.xml:如下:
       

Xml代码 复制代码
  1. <set name="roles" table="tb_role_right" cascade="all">  
  2.           <key column="right_id"/>  
  3.           <many-to-many column="role_id" class="hbp.sys.data.Role"/>  
  4.        </set>  
 <set name="roles" table="tb_role_right" cascade="all">
           <key column="right_id"/>
           <many-to-many column="role_id" class="hbp.sys.data.Role"/>
        </set>

  
      role.hbm.xml文件中类似:
       

Xml代码 复制代码
  1. <set name="rights" table="tb_role_right" cascade="all">  
  2.          <key column="role_id"/>  
  3.          <many-to-many column="right_id" class="hbp.sys.data.Right"/>  
  4.        </set>   
 <set name="rights" table="tb_role_right" cascade="all">
          <key column="role_id"/>
          <many-to-many column="right_id" class="hbp.sys.data.Right"/>
        </set> 

  

4. 几个值得注意的问题:
        a)在xml?映射文件中,写类的名字时一定用类的全名:即:包+类名如:(hbp.sys.data.Staff),这个错误使我费了半天劲.:(
        b)我在写实现基本DAO操作时,写了
             session.delete("from Right as right where right.id="+id); 
             程序死活报错,我折腾了半天,跟踪到底,才恍然大悟,hibernate在解析sql语句的时候把
             其中的right,当成了数据库中的右连接("保留字"),唉,这种关键字,不能随便用啊,:)

 

5. hibernate中HQL语言的查询根据你的sql的不同而返回不同的对象类型.
         如果你使用session.find(String hql)
         一般会返回一个List,如:from Staff staff;返回的是包含所有的员工对象的集合
         如你的hql为:select count(*) from Staff staff;则返回的是一个Integer对象
         如果你使用的hql为:select count(distinct staff.name),count(*) from Staff staff;则返回的是一个Object
         即Object[],需要先把他转换成Object[],然后在取[0],[1].
         这种设计我不知道hibernate是如何处理的,感觉既好也不好.好的是可以使用一个find获得任意查询
         不好在于根据hql来处理返回结果,容易出错.

分享到:
评论

相关推荐

    hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...

    Hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    常用Hibernate主键生成策略

    ### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...

    hibernate 主键生成策略

    ### Hibernate 主键生成策略详解 Hibernate 是一款流行的 Java 持久层框架,它提供了对象关系映射(ORM)的功能,使得 Java 开发者能够更高效地与数据库进行交互。在 Hibernate 中,主键生成策略是一项核心功能,...

    Hibernate主键生成策略.doc

    Hibernate主键生成策略.docHibernate主键生成策略.doc

    hibernate主键生成策略详解

    ### hibernate主键生成策略详解 #### 一、assigned **assigned** 主键生成策略意味着主键的值是由外部程序负责生成的,并且在执行 `save()` 方法之前必须明确指定一个值。在这种策略下,Hibernate 不参与主键的...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    Hibernate主键生成策略.docx

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一种流行的 Java 持久化框架,它简化了数据库操作,并提供了多种主键生成策略。主键是表中的一个或多个字段组合,用于唯一标识表中的每一条记录。...

    Hibernate各种主键生成策略

    Hibernate各种主键生成策略详解,包括 assigned increment hilo seqhilo sequence identity native uuid foreign uuid.hex sequence-identity 等

    Hibernate各种主键生成策略与配置详解

    ### Hibernate 主键生成策略与配置详解 #### 一、概述 在使用Hibernate进行持久化操作时,合理选择和配置主键生成策略对于确保数据的一致性和优化性能至关重要。本文将详细介绍几种常见的主键生成策略,并结合示例...

    Java探索之Hibernate主键生成策略详细介绍

    Hibernate主键生成策略详细介绍 在Java探索中,Hibernate提供了多种主键生成策略,满足不同场景下的需求。下面是对Hibernate主键生成策略的详细介绍: 1. Increment主键生成策略 Increment主键生成策略是由...

    持久化类主键生成策略+例子

    ### Hibernate主键生成策略 1. **`native`**:类似于JPA的`GenerationType.AUTO`,根据底层数据库选择合适的生成策略。 2. **`identity`**:相当于JPA的`GenerationType.IDENTITY`,适合自动增长主键的数据库。 3...

Global site tag (gtag.js) - Google Analytics