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属性数组,这些属性表示关联的“多”端上实体的主键