`

hibernate的ID生成策略(annotation方式@GeneratedValue)

阅读更多

记录hibernate中使用annotation的方式实现主键生成策略:

一般情况下,hibernate中使用annotation的主键生成策略,都是使用annotation的标准注解(javax.persistence.GeneratedValue),而不是使用hibernate的扩展的annotation方式,当然,使用也是没有错的,推荐使用标准的annotation。

标准的annotation方式的主键生成策略如下:

  • AUTO - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库.
  • TABLE - 使用表保存id值(也就是会为应用的表创建一张专门保存Id的表,记录对应的表的对应最大的ID值,如下图)

CPU7@71(TD68TSQ(FD@D}MM

  • IDENTITY - identity column
  • SEQUENCE – sequence

 

下面的例子展示了使用SEQ_STORE配置的sequence生成器

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
public Integer getId() { ... }
         

下面这个例子使用的是identity生成器

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() { ... }

AUTO生成器适用于可移植的应用(在多个DB间切换). 多个@Id可以共享同一个identifier生成器,只要把generator属性设成相同的值就可以了. 通过@SequenceGenerator @TableGenerator,你可以配置不同的identifier生成器. 每一个identifier生成器都有自己的适用范围,可以是应用级(application level)和类一级(class level). 类一级的生成器在外部是不可见的, 而且类一级的生成器可以覆盖应用级的生成器. 应用级的生成器则定义在包一级(package level)(如package-info.java):

@javax.persistence.TableGenerator(
    name="EMP_GEN",
    table="GENERATOR_TABLE",
    pkColumnName = "key",
    valueColumnName = "hi"
    pkColumnValue="EMP",
    allocationSize=20
)
@javax.persistence.SequenceGenerator(
    name="SEQ_GEN",
    sequenceName="my_sequence"
)
package org.hibernate.test.metadata;
         

如果在org.hibernate.test.metadata包下面的 package-info.java文件用于初始化EJB配置, 那么该文件中定义的 EMP_GEN SEQ_GEN都是应用级的生成器. EMP_GEN定义了一个使用hilo算法 (max_lo为20)的id生成器(该生成器将id的信息存在数据库的某个表中.). id的hi值保存在GENERATOR_TABLE中. 在该表中 pkColumnName"key"等价于 pkColumnValue "EMP", 而valueColumnName "hi"中存储的是下一个要使用的最大值.

SEQ_GEN则定义了一个sequence 生成器, 其对应的sequence名为 my_sequence. 注意目前Hibernate Annotations还不支持sequence 生成器中的 initialValue allocationSize参数.

下面这个例子展示了定义在类范围(class scope)的sequence生成器:

@Entity
@javax.persistence.SequenceGenerator(
    name="SEQ_STORE",
    sequenceName="my_sequence"
)
public class Store implements Serializable {
    private Long id;

    @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
    public Long getId() { return id; }
}
         

在这个例子中,Store类使用名为my_sequence的sequence,并且SEQ_STORE 生成器对于其他类是不可见的. 注意在org.hibernate.test.metadata.id包下的测试代码有更多演示Hibernate Annotations用法的例子..

下面是定义组合主键的几种语法:

  • 将组件类注解为@Embeddable,并将组件的属性注解为@Id
  • 将组件的属性注解为@EmbeddedId
  • 将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

对于EJB2的开发人员来说 @IdClass是很常见的, 但是对于Hibernate的用户来说就是一个崭新的用法. 组合主键类对应了一个实体类中的多个字段或属性, 而且主键类中用于定义主键的字段或属性和 实体类中对应的字段或属性在类型上必须一致.下面我们看一个例子:

@Entity
@IdClass(FootballerPk.class)
public class Footballer {
    //part of the id key
    @Id public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    //part of the id key
    @Id public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getClub() {
        return club;
    }

    public void setClub(String club) {
        this.club = club;
    }

    //appropriate equals() and hashCode() implementation
}

@Embeddable
public class FootballerPk implements Serializable {
    //same name and type as in Footballer
    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    //same name and type as in Footballer
    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    //appropriate equals() and hashCode() implementation
}

如上, @IdClass指向对应的主键类.

Hibernate支持在组合标识符中定义关联(就像使用普通的注解一样),而EJB3规范并不支持此类用法.

@Entity
@AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
public class TvMagazin {
    @EmbeddedId public TvMagazinPk id;
    @Temporal(TemporalType.TIME) Date time;
}

@Embeddable
public class TvMagazinPk implements Serializable {
    @ManyToOne
    public Channel channel;
    public String name;
    @ManyToOne
    public Presenter presenter;
}
  
具体的详细文档,参考hibernate-annotations-index 文档,hibernate的annotation API 

分享到:
评论

相关推荐

    JAVA 的ID生成策略

    JAVA ID生成策略是一种在Hibernate框架中使用的策略,用于生成实体类的主键值。这种策略在Annotation情况下,主要有三种方式生成主键值。 第一种方式是使用数据库的自动增长字段生成。这种方式使用@GeneratedValue...

    hibernate 中文文档 and _annotation.chm

    - @Id:标识类中的主键字段,可以配合@GeneratedValue指定主键生成策略。 - @GeneratedValue:定义主键的自增策略,如IDENTITY(数据库自动增长)、SEQUENCE(序列)等。 - @Column:定义属性对应表中的列,可以...

    Hibernate distribution and annotation

    3. **@Id**: 标识实体的主键字段,可以与@GeneratedValue结合使用来自动生成主键。 4. **@GeneratedValue**: 控制主键生成策略,如自动递增、UUID等。 5. **@Column**: 描述实体属性如何映射到表的列,包括长度...

    hibernate-annotation

    4. `@GeneratedValue`:用于指定主键生成策略,如自增、UUID等。例如: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; // ... } ``` 5. `@...

    hibernate annotation hibernate3

    `@Id`注解用于指定实体类中的主键字段,它通常与`@GeneratedValue`一起使用,表示主键自动生成。例如: ```java @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; ``` 三、字段级注解 1....

    hibernate annotation api chm文件

    - `@Id`: 定义实体的主键字段,通常与`@GeneratedValue`结合使用,以指定主键生成策略。 - `@GeneratedValue`: 控制主键值的自动生成,可选择策略如IDENTITY、SEQUENCE、TABLE等。 - `@Column`: 定义实体属性与...

    hibernate-annotation-3.4.0.GA

    四、生成主键策略@GeneratedValue 对于自动生成主键,我们可以使用`@GeneratedValue`注解,配合不同的策略。例如,使用序列方式生成主键: ```java @Entity @Table(name = "users") public class User { @Id @...

    hibernate_annotation中文版

    2. 使用合理的主键生成策略,如@Id + @GeneratedValue(strategy = GenerationType.IDENTITY)。 3. 在处理关联关系时,注意外键约束的设置,确保数据一致性。 4. 合理利用预编译查询,提高性能。 总结,Hibernate ...

    Hibernate Annotation库

    这个jar文件包含了Hibernate的注解API,提供了各种注解如`@Entity`、`@Table`、`@Id`、`@GeneratedValue`等,用于声明实体类和它们在数据库中的表对应关系,以及主键生成策略。例如,`@Entity`注解标记一个类为...

    Hibernate Annotation 中文文档

    - `@GeneratedValue`: 配置主键生成策略,如自动增长或序列。 - `@Column`: 配置字段与表列的映射,包括列名、长度、是否可为空等属性。 - `@ManyToOne`, `@OneToMany`, `@OneToOne`, `@ManyToMany`: 定义不同类型的...

    Hibernate-Annotation-3.4.0帮助文档

    - `@Id`: 标识一个字段为实体的主键,通常与`@GeneratedValue`一起使用,用于自动生成主键值。 - `@GeneratedValue`: 配置主键生成策略,如 AUTO、IDENTITY、SEQUENCE 和 TABLE。 - `@Column`: 描述实体类字段如何...

    hibernate annotation

    这些注解包括@Table、@Column、@Id、@GeneratedValue等,它们提供了数据库表定义、主键生成策略以及字段映射的规则。 ### 2. 主键注解 - `@Id`: 这个注解标记一个字段作为实体的主键。例如: ```java @Entity ...

    hibernate annotation 中文文档

    - `@GeneratedValue`: 用于主键字段,定义主键生成策略,如.AUTO(自增)或.SEQUENCE(序列)。 - `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 用于处理各种关联关系,如一对一、一对多、多对一、多...

    Hibernate Annotation入门

    4. `@GeneratedValue`:定义主键生成策略,如自动增长(AUTO)、序列(SEQUENCE)等。 5. `@Column`:用于指定字段与表列的映射,包括列名、长度、是否允许为空等属性。 6. `@OneToMany`, `@ManyToOne`, `@OneToOne`...

    hibernate-Annotation.jar

    - `@GeneratedValue`:用于指定主键生成策略,例如自增(IDENTITY)、序列(SEQUENCE)等。 - `@Temporal`:对于日期时间类型,`@Temporal(TemporalType.TIMESTAMP)`等可以指定存储格式。 4. **关系映射注解** -...

    HibernateAnnotation

    ### HibernateAnnotation ...通过上述介绍,我们可以看到HibernateAnnotation技术不仅简化了配置过程,而且提供了一种更加灵活的方式来管理对象与数据库之间的映射关系。这对于提高开发效率和维护性都有着重要的意义。

    Hibernate-Annotation初步.rar

    在这个例子中,`@Entity`告诉Hibernate这是一个需要持久化的类,`@Table(name = "User")`表示该类映射到名为“User”的数据库表,`@Id`标记的`id`字段是主键,`@GeneratedValue`定义了主键生成策略,而`@Column(name...

    Hibernate annotation

    在Hibernate中,主键的处理有多种方式,如@Id、@GeneratedValue等。 1. @Id:标记实体类中的主键字段,相当于XML中的<id>标签。 2. @GeneratedValue:用于声明主键生成策略,如AUTO(默认,由数据库自动生成)、...

    Hibernate Annotation 笔记 总结 注解

    - `@GeneratedValue`:指定主键生成策略。 - `@Column`:定义字段在数据库表中的列名和属性。 - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:定义对象间的一对多、多对一、一对一和多对多关系。 ### ...

Global site tag (gtag.js) - Google Analytics