`
fcmfcm01
  • 浏览: 66599 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate配置手册--主键生成策略

阅读更多

Hibernate.cfg.xml配置文件:

<?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、指定参数的情况:
  

  <id name="id" unsaved-value="0"> 
      <generator class="sequence">
        <param name="sequence">SEQ_CHILD</param>
      </generator>
</id>

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

 

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

<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自己提供的方法实现主键唯一:
 

 <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的文件:
     

 <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 文件
     

<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:如下:
       

 <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文件中类似:
       

 <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-annotations-3.4.0.GA.chm中文版

    @Id用于标记主键字段,可以配合@IdClass或@GeneratedValue来定义主键生成策略。 2. **属性注解**:@Column定义列名和属性,如长度、是否允许为空等。@GeneratedValue用于设置自动增长策略,如IDENTITY、SEQUENCE或...

    hibernate-reference-3.1.1.pdf

    其中,关于主键生成策略的讨论,如Hi/Lo算法、UUID算法和自动增长列的处理,为开发者提供了多种选择,以适应不同的场景需求。 综上所述,《hibernate-reference-3.1.1.pdf》不仅是一份技术手册,更是Hibernate...

    Hibernate配置手册.txt

    ### Hibernate配置详解与...通过以上解析,我们不仅理解了`hibernate.cfg.xml`的基本结构与核心配置,还深入了解了Hibernate主键生成策略以及实体关系映射的关键概念,这对于高效地进行数据库操作和管理具有重要意义。

    Hibernate主键类型说明和配置手册.doc

    总的来说,选择合适的主键生成策略和正确配置是Hibernate成功集成到项目的关键步骤。理解这些策略的差异以及它们如何与不同数据库交互,将有助于优化性能并避免潜在的问题。在实际开发中,应根据项目需求和所使用的...

    hibernate 3.2中文手册 中文文档

    - 包括定义表名、字段映射以及主键生成策略等内容。 - **1.2.3 Hibernate配置** - 描述如何通过`hibernate.cfg.xml`文件来配置Hibernate,包括数据库连接信息、方言设置等。 - **1.2.4 用Ant构建** - 指导如何...

    hibernate参考手册中文版

    **Hibernate参考手册中文版** Hibernate是一款强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据库事务。在《Hibernate参考手册中文版》中,我们将深入探讨这个...

    hibernate v3.04中文参考手册

    - 自定义主键生成策略,如SequenceGenerator、TableGenerator等。 12. **事件监听与拦截器** - 实现Hibernate事件监听器,监听对象的生命周期事件。 - 使用Interceptor,自定义逻辑,如对象的预加载、预更新等。...

    Hibernate 3.x 参考手册

    - 数据库特定的主键生成策略。 - 示例:MySQL 使用 `AUTO_INCREMENT`。 - **分配标识符** - 用户手动指定主键值。 - 示例: ```xml ``` - **主键生成策略** - 选择合适的生成策略是优化应用性能的关键。 ...

    Hibernate4.1.11中文手册

    这包括了主键生成策略、属性类型映射、关联关系(一对一、一对多、多对一、多对多)的配置,以及懒加载(Lazy Loading)和级联操作(Cascading)等高级特性。 在事务处理部分,手册会阐述Hibernate的事务管理机制,...

    hibernate中文手册

    常见的注解包括`@Entity`(表示数据库表)、`@Id`(主键)、`@GeneratedValue`(主键生成策略)等。 5. **查询语言(HQL)**:Hibernate Query Language是Hibernate特有的面向对象的查询语言,类似于SQL,但更适应...

    HIBERNATE官方参考手册

    《Hibernate官方参考手册》是学习和理解Hibernate的核心资料,提供了详尽的API文档、配置指南和使用示例。以下是对Hibernate的一些关键知识点的详细说明: 1. **对象关系映射(ORM)**:ORM是Hibernate的核心特性,...

    hibernate 中文参考手册

    - **主键生成策略**:介绍主键生成的不同策略。 **4.1.3 优选非最终类** - **非最终类优势**:探讨为什么建议使用非最终类。 - **示例代码**:给出具体的非最终类示例代码。 **4.1.4 声明持久化字段的访问器和...

    Hibernate手册

    - **id**:配置主键生成策略。 - **增强的标识符生成器**:更复杂的主键生成逻辑。 - **composite-id**:处理复合主键。 - **鉴别器**:在多态映射中区分子类。 - **版本**:支持乐观锁机制。 - **timestamp**:自动...

    Hibernate Reference Documentation(Hibernate参考手册)

    - **generator**:主键生成策略,如`increment`、`identity`等。 - **Hi/Lo算法**:一种高效的主键生成算法。 - **UUID算法**:生成全局唯一的标识符。 - **标识列和序列**:对于支持标识列或序列的数据库系统。...

    Hibernate 中文手册

    - **主键生成策略**:包括自增、UUID 等多种策略,可根据实际需求选择合适的策略。 - **关联映射**:一对多、多对多等关系的实现方法。 #### 五、查询与检索 - **HQL (Hibernate Query Language)**:一种面向对象...

    Hibernate技术手册中文版

    映射包括字段映射、主键生成策略、关联映射(一对一、一对多、多对一、多对多)以及自定义类型映射等。 除此之外,Hibernate还支持复杂的查询操作,如分页、排序、聚合函数以及子查询。在处理大数据量时,可以通过...

    hibernate开发手册2hibernate开发手册2

    例如,@Entity表示这是一个实体类,@Table指定对应的数据库表,@Id标记主键字段,@GeneratedValue自动生成主键等。 4. **数据操作** Hibernate提供了多种方式来操作数据,包括: - **CRUD操作**:创建(Create)...

    Hibernate3.2官方中文参考手册+英文手册+API文档

    - **Entity Mapping**:通过Hibernate的XML映射文件(.hbm.xml)或注解方式,将Java类与数据库表关联起来,定义字段映射和主键生成策略。 - **SessionFactory和Session**:SessionFactory是Hibernate的核心,它负责...

Global site tag (gtag.js) - Google Analytics