首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-11-05 
hibernate的ID生成策略(annotation方式@GeneratedValue)IDENTITY - identity columnSEQUENCE – sequence?

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

  • 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}@Embeddablepublic 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;}@Embeddablepublic class TvMagazinPk implements Serializable {    @ManyToOne    public Channel channel;    public String name;    @ManyToOne    public Presenter presenter;}
        
      具体的详细文档,参考hibernate-annotations-index 文档,hibernate的annotation API 

热点排行