`

Hibernate的ID生成策略/联合主键解决方案[转]

 
阅读更多

转至http://blog.163.com/fengzhisha0914@126/blog/static/1503147852010749441745/

 

对于不同数据库的主键id,生成是不一样的.在Hibernate中也有相对应的策略.

 

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

所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。

 

下面是一些内置生成器的快捷名字:

increment

用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

identity

对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。

sequence

在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

hilo

使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。

seqhilo

使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

uuid

用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。

guid

在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。

native

根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

assigned

让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。

select

通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。

foreign

使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

sequence-identity

一种特别的序列生成策略,使用数据库序列来生成实际值,但将它和JDBC3的getGeneratedKeys结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向JDK 1.4的Oracle 10g驱动支持这一策略。注意,因为Oracle驱动程序的一个bug,这些插入语句的注释被关闭了。(原文:Note comments on these insert statements are disabled due to a bug in the Oracle drivers.)

 

XML配置方法:

 

<hibernate-mapping>
    <class name="com.hibernate.test.entitys.Student" table="student">
       <id name="id">
           <!--<generator class="assigned"/>-->
           <generator class="native"/><!—从指定使用哪种id生成策略-->
       </id>
    <property name="name"/>
    <property name="sex"/>
    <property name="password"/>
    </class>
   
</hibernate-mapping>

 

 Annotation注解方法:

1.

 

//映射到数据库中的主键
    @Id
//此注解默认值为auto,也就是为自动.相当于在配置文件中使用”native”
    @GeneratedValue
    public int getId() {
       return id;
    }

 2.

如果想指定具体的id生成策略(IDENTITY/SEQUENCE/AUTO),比方说为oracle数据库指定id生成策略,那么就只能用sequence.

 

//只需要把注解写成这样就行(也就是指定策略为自己需要的类型,GenerationType是各种策略的枚举值)
@GeneratedValue(strategy=GenerationType.SEQUENCE)

 上述方法虽然可行,但是会有点别扭,哪里别扭呢?

也就是生成表的时候,所有的表都使用同一个sequence了.虽然也不碍事,但毕竟不符合习惯,我们的习惯应该是每张表都有它自己的sequence.

用下面的方法就可以解决:

 

//映射成数据库中的表
@Entity
//如果类名和数据库中的表名不一致,通过此注解声明
@Table(name="_Teacher")
//为每张表指定自己的sequence,name属性是生成器的名字,sequenceName是数据库中sequence的名字
@SequenceGenerator(name="TeacherSEQ",sequenceName="TeacherSEQ_DB")
public class Teacher {
    private int id;
    private String name;
    private String title;
    private String myRealName;
    private ZhiCheng zhiCheng;  //自定义枚举类型
   
    //如果不需要将此属性映射到数据库中的字段,用此注解
    @Transient
    public String getMyRealName() {
       return myRealName;
    }
    public void setMyRealName(String myRealName) {
       this.myRealName = myRealName;
    }
 
    //映射到数据库中的主键
    @Id
    //注意这里的第二个参数,值是在类上指定的生成器的名字!
   @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="TeacherSEQ")
    public int getId() {
       return id;
    }
    public void setId(int id) {
       this.id = id;
    }
 
    //如果属性名和数据库中的字段不一样,通过此注解声明
    @Column(name="_name")
    public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
 
    public String getTitle() {
       return title;
    }
    public void setTitle(String title) {
       this.title = title;
    }
   
    //映射自定义枚举(映射到数据库中为Varchar类型)
    @Enumerated(EnumType.STRING)
    public ZhiCheng getZhiCheng() {
       return zhiCheng;
    }
    public void setZhiCheng(ZhiCheng zhiCheng) {
       this.zhiCheng = zhiCheng;
    }
}

 

 

 

联合主键的映射:

首先要把联合主键的几个属性提取为一个主键类;

 

1.XML配置

         composite-id

 

<!—-指定提取出来的联合主键的类-->< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
<composite-id name="pk" class="com.hibernate.test.entitys.TeacherPK">
       <key-property name="id"/><!—-指定联合主键的各个属性-->
       <key-property name="name"/>
    </composite-id>

 需要重写联合主键类的hashcode()和equals()

hashcode()只需要返回其中一个String类型的hashcode就行

equals()需要判断联合主键类的各个属性都相同,才能返回true,反之.

 

 

2.Annotation联合主键映射的三种方法:

 

Method 1:给提取出来的主键类加上@Embeddable注解,实体类getXXX主键的方法上加@Id

 

Method 2:提取出来的主键类不加注解,实体类getXXX主键的方法上加@EmbeddedId.

 

Method 3:提取出来的主键类不加注解,实体类的联合主键分别都加@Id,实体类上加@IdClass(这里指定主键类)

 

eg:

 

//映射成数据库中的表
@Entity
@IdClass(TeacherPK.class)---第三种方法
public class Teacher {
    /*private int id;
    private String name;  把这个类中的id和name属性提取为联合主键*/
    private String title;
private TeacherPK pk;
   
    @Id---第一种方法
    @EmbeddedId---第二种方法
    getPk(){…}
setPk(){…}
   
 
第三种方法去掉主键类对象,
@Id
getId(){…}
@Id
getName(){…}
    public String getTitle() {
       return title;
    }                               
    public void setTitle(String title) {
       this.title = title;
    }
}

 

 

/**
 * 提取出来的主键类
 * @author PF_CQ
 *
 */
@Embeddable----第一种方法
第二种方法,去掉注解
第三种方法,去掉注解
public class TeacherPK{
    private int id;
    private String name;
 
getXXX{}…setXXX{}
getXXX{}…setXXX{}
 
}
分享到:
评论

相关推荐

    Hibernate 性能优化

    2. **尽量不使用联合主键**:联合主键虽然可以减少冗余,但会增加查询复杂度,尤其是对于大型数据库而言。除非确实有必要,否则建议使用单一字段作为主键。 3. **ID 的生成机制**:不同的数据库有不同的 ID 生成...

    hibernate5.0jar包

    总的来说,Hibernate 5.0是一个强大且全面的ORM解决方案,极大地简化了Java应用程序与数据库的交互过程,提高了开发效率。通过深入理解和熟练使用这个jar包,开发者可以构建出高效、稳定、易于维护的业务系统。

    SpringMVC+Hibernate+Jpa Maven环境搭建

    在业务层,你可以使用JPA的注解来定义实体类,比如`@Entity`表示数据库表,`@Table`指定表名,`@Id`标识主键,`@GeneratedValue`控制主键生成策略等。在DAO层,使用Hibernate的Session或JPA的EntityManager来执行...

    hibernate4.2RELASEjar包

    Hibernate 4.2 是一个非常重要的Java持久化框架,它为开发者提供了ORM(对象关系映射)解决方案,使得在Java应用程序中操作数据库变得更加方便。这个"hibernate4.2RELASEjar包"包含了所有你需要运行和开发基于...

    Hibernate3.3 中文参考手册(1)(2)

    **Hibernate 3.3 中文...无论是初学者还是经验丰富的开发者,都能从中找到所需的指导和解决方案。通过阅读这份手册,你可以深入理解Hibernate的工作原理,提升开发效率,并更好地设计和实现数据库驱动的Java应用程序。

    传智播客 李勇 hibernate 的ppt

    2. 解决方案:使用ORM框架,如Hibernate、TopLink和OJB,自动处理对象与数据库之间的转换。 **安装配置Hibernate:** - 下载地址:http://www.hibernate.org,选择合适的版本,例如3.2.5。 - 添加必要的JAR文件到...

    Hibernate

    - **主键生成策略**:在`&lt;id&gt;`元素中定义,常见的策略包括`increment`(自增)、`native`(由数据库自动生成)等。 #### 常用查询方法 - **最简单的查询**:使用Session对象的`get()`或`load()`方法获取单个对象。...

    hibernate培训第三天

    二级缓存则可配置为全局共享,可以使用第三方缓存解决方案如Ehcache。理解缓存的工作原理以及如何配置和优化缓存是提升系统性能的关键。 **六、关联映射** hibernate支持多种关联映射,如一对一(@OneToOne)、一对...

    hibernate_3.2_官方中文参考手册.

    - **5.1.4.4 标识字段和序列**:针对特定数据库(如Oracle)的主键生成方案。 - **5.1.4.5 程序分配的标识符**:手动分配主键值。 - **5.1.4.6 触发器实现的主键生成器**:利用数据库触发器自动生成主键。 - **...

    hibernate初学者jar包

    Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射(ORM)解决方案,使得在Java应用程序中管理数据库变得更为简单。这个“hibernate初学者jar包”显然是针对那些刚接触Java和Hibernate的...

    hibernate 3.2.0 RC1 中文帮助文档

    4. **属性映射(Annotations)**:Hibernate 3.2.0开始大量使用Java 5的注解进行对象属性与数据库字段的映射,如`@Id`标识主键,`@GeneratedValue`控制主键生成策略,`@Column`定义列属性等。 5. **持久化接口...

    Hibernate知识总结

    4. **O/R Mapping Frameworks**: Hibernate、iBatis 和 JPA 是常见的 ORM 框架,其中 JPA(Java Persistence API)是 Java 标准,Hibernate 和 iBatis 也是广泛使用的解决方案。 5. **日志框架**: Hibernate 默认...

    hibenate串讲

    Hibernate是一种Java环境下优秀的对象关系映射(Object Relational Mapping,简称ORM)解决方案。它为开发者提供了一种将Java应用中的对象模型与关系型数据库中的表进行映射的方式,使得开发者能够在不直接编写SQL的...

    springmybatis

    mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...

    spring_jpa_hib.zip

    而Java Persistence API (JPA) 作为Java标准的ORM(对象关系映射)解决方案,使得开发者可以更加便捷地处理数据库操作。当Spring与JPA相结合时,能够为开发者提供一个高效、灵活且易于维护的数据访问层。本篇文档将...

    NHibernateByExample.pdf

    - **ID生成器**:提供了多种策略来自动生成实体的唯一标识符。 - **组合主键映射**:当实体具有多个联合主键时,可以使用复合主键映射。 - **对像属性映射**:定义实体属性与数据库列之间的映射。 - **Nullable类型...

    boot-jpa:Spring Boot 整合JPA

    而Java Persistence API(JPA)作为Java领域主流的对象关系映射(ORM)解决方案,使得开发者可以使用面向对象的方式处理数据库操作。本文将深入探讨如何在Spring Boot项目中整合JPA,实现高效、便捷的数据操作。 1....

    JPA:关于JPA的一切

    综上所述,JPA通过提供一套完整的ORM解决方案,使得Java开发者可以更加专注于业务逻辑,而不是数据库操作,大大提高了开发效率和代码的可维护性。通过理解和熟练运用上述知识点,可以更好地在实际项目中应用JPA。

Global site tag (gtag.js) - Google Analytics