Hibernate生成主键

1:@Id和@GeneratedValue

     这两个用于标出主键。@Id会自动地决定最合适的主键生成策略。但可以通过@GeneratedValue来覆盖@Id的值。@GerneratedValue有两个属性:strategy和generator。strategy的值是javax.persistence.GeneratorType枚举中的值,其值是AUTO,IDENTITY,SEQUENCE,TABLE;而generator值是一个string类型,它代表表的属性名。

2:@SequenceGenerator生成主键值

      这个标志用于通过数据库序列生成主键属生。序列是一个数据库对象,可以用作主键值的来源。要想声明特定的序列对象及其属性,必须使用@SequenceGenerator与@GeneratedValue两个合在一起使用。@SequenceGenerator的格式为:。@SequenceGenerator(name="seq1",sequenceName="HIB_SEQ"),其使用的例子如下

@SequenceGenerator(name="SEQ_Name",sequenceName="SEQ_DB_Name")

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_Name")

@SequenceGenerator的参数说明

参数注意:SEQ_Name:表示为申明的这个Sequence指定一个名称,以便使用
SEQ_DB_Name:表示为数据库中的Sequence指定一个名称。两个参数的名称可以一样

@GeneratedValue的参数说明

参数:strategy:固定为GenerationType.SEQUENCE
Generator:在实体类前面申明的sequnce的名称

3:@TableGenerator生成主键值

      与@SequenceGenerator相似,这个不建议使用。

4:@用@Id、@IdClass和@EmbeddedId组合主键

     如果组件是多个列表示,要经过下面几个部署来实现:

1):必须创建一个类来表示这个主键。这个类不需要自已的主键,但是它必须是一个公共类,必须有默认的构造器,必须是可序列化的,必须实现hashCode()和equals()方法。

2):创建了这个主键类后,有3种使用它的方式 :

    A:给主键类标上@Embeddable,在实体类中添加一个引用它的普通属性,并且加上@Id注解

    B:在实体类中添加一个引用主键类的普通属性,并且加上@EmbeddedId注解

    C:在实体类中添加引用主键类的所有字段的属性,给它们加上@Id注解,给实体类加上@IdClass注解并指定主键类的类名。

其中使用@Id和@Embeddable注解是类的最自然方式。

5:@Table和secondaryTable进行数据库表映射

     可以使用@Table注解指定数据库中用来进行实体持久化表的细节。如果省略这个注解,就使用类名当做表名。它有4个属性。如果数据库模式是从带注解的类生成的,而且需要补充任何特有的约束,那么就要应用唯一约束。否则,不施加这些约束

      @SecondaryTable注解可以将实体bean持久化到几个不同的数据库表中。其基本属性与@Table注解的值相同,但增加了join属性。join属性定义了与主数据库表进行联结的联结列。其值是PrimaryKeyJoinCloumn对象的数组。如果省略join属性,那么表根据同名的主键列进行联结。

     当从辅助表获取实体中的属性时,必须给它标上@Column注解,并且用表属性标识适当的表。

6:@Basic对基本类型进行持久化

     在默认情况下,POJO中的属性和实例变量会被持久化---Hibernate会替你存储它们的值,并且它们采取即时读取它们(即,当从数据库中获取这个实体时,同时也会获取所有的基本字段和属性)。另外,如果字段或属性不是基本数据类型时,那么可以作为null值存储和获取。

     通过在适当的类成员上应用@Basic注解,可以覆盖这种默认行为。其格式为:@Basic(optional="true"或"false",fetche="EAGER"或"LAZY")

@Basic较少使用

7:用@Transient避免持久化

8:用@Column映射属性和字段

    使用时,通常会覆盖以下属性:

      name:充许显式地指定列名

      length:充许显式的指定用来映射的列的大小。

      nullable:可以在生成模式时将列标为NOT NULL,默认情况下,字段应该充许为空;如果字段是必须的,那么这个值就应该设置成false

      unique,指定列只包含唯一值,默认设置是false。

其它不常用的属性为

      当实体跨一个或多个辅助表进行映射时,使用table属性。

      insertable属性的默认值是true。如果设置为false,那么Hibernate生成的插入语句会忽略注解的字段(就是不对它进行持久化)

      updatable属性的默认值是true。如果设置为false,那么Hibernate生成的更新语句就会忽略注解的字段(也就是在持久化不再修改它)

      precision属性可以在生成模式时指定小数数字列的精度,如果持久化后的值不是小数,就会忽略它。

      scale属性可以在生成模式时指定小数数字列的刻度。

9:对实体进行建模

    1:对嵌入实体(组件)的一对一关联进行为映射

          如果一个实体的所有字段都维护在与另一个实体相同的表中,那么在Hibernate中就将这个实体称为组件。EJB 3将这样的实体称为嵌入的(Embedded)实体。

         @Embedded和@Embeddable属性用来管理这样的关系 。@Embeddable表示被包含的实体,只能使用@Basic,@Column,@Lob,@Temporal和@Enumerated注解,

它不能有自已的主键,因为它的主键就是包含它的实体的主键。@Embedded表示包含另外一个实体,@Embedded有@AttributeOverride和@AttributeOverrides注解来覆盖特定的列了。如

    @Embedded

     @AttributeOverrides({

            @AttributeOverride(name="address",column=@Column(name="ADDR")),

            @AttributeOverride(name="county",column=@Column(name="NATION")),

      })

  其中address是被包含实体的属性,ADDR是重命名后的属性名

    2:对传统的一对一关联进行映射

         如果两个实体之间不是嵌入关系,那么就可以使用OneToOne注解进行。不过在使用OneToOne注解之前,最好考虑是否使用前面的嵌入技术。它包含下面的几个可选

属性:

        targetEntity可以设置为存储这个注解的实体类

        cascade可以设置为CascadeType枚举的任何值,它有ALL,MERGE(update),PERSIST(对实体在数据库中的状态进行最初存储),REFRESH(select),REMOVE的级联操作。

   2:多对一或一对多关联进行映射

        在多端实体的表一列中,管理一对多的“一”端实体的外键。它使用@OneToMany注解,由于EJB3没有提供管理有序集合的次序机制,可以通过@OrderBy或是@IndexCoumn来解决这个问题。@OneToMany注解的属性作如下说明:

     1)mappedBy:对于双向关联是必须的,对于单向关联是可选的。

     2)cascade属性是可选的,值是javax.persistence.CascadeType枚举的成员之一,表示映射的实体的级联行为

     3)targetEntity是可选的,一般不使用,表示目标实体的类

     4)fetch属性是可选的,值是FetchType枚举的成员之一指定即时读取(EAGER)或是延迟(LAZY)

 @ManyToOne表示多对一,其属性与OneToMany相似,属性如下:

      1)optional表示值是否可空,默认是true

      2)cascade属性,与OneToMany一样,默认不设置

      3)fetch属性,默认是LAZY

      4)targetEntity属性,可OneToMany一样

     对于@ManyToOne还增加@JoinColumn属性,从而为关联指定默认列之外的外键列,在建立单向的一对多关联时,可以使用键接表表示这个有关系。这需要增加@JoinTable注解。@JoinTable注解的属性如下:

      1)name:表示这个关联的链接表的名称

       2)catalog:包含链接表的数据库编目的名称

       3)schema:是包含链接表的数据库模式的名称

       4)joinColumns是一个@JoinColumn属性数组,这些属生表示关联的“一”端上实体的主键

       5)inverseJoinColumns是一个@JoinColumn属性数组,这些属性表示关联的“多”端上实体的主键

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值