日期:2014-05-16  浏览次数:20435 次

jpa 注释用法

一、 实体 Bean

每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明。

声明实体Bean

@Entity
public class Flight implements Serializable {
? Long id;
? @Id
? public Long getId() { return id; }
? public void setId(Long id) { this.id = id; }
}

@Entity 注解将一个类声明为实体 Bean, @Id 注解声明了该实体Bean的标识属性。

Hibernate 可以对类的属性或者方法进行注解。属性对应field类别,方法的 getXxx()对应property类别。

定义表

通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字。

@Entity
@Table(name="tbl_sky")
public class Sky implements Serializable {

...

@Table 注解包含一个schema和一个catelog 属性,使用@UniqueConstraints 可以定义表的唯一约束。

@Table(name="tbl_sky",
? uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}
)

上述代码在? "month" 和 "day" 两个 field 上加上 unique constrainst.

@Version 注解用于支持乐观锁版本控制。

@Entity
public class Flight implements Serializable {
?? ...
?? @Version
?? @Column(name="OPTLOCK")
?? public Integer getVersion() { ... }
}

version属性映射到 "OPTLOCK" 列,entity manager 使用这个字段来检测冲突。 一般可以用 数字 或者 timestamp 类型来支持 version.

实体Bean中所有非static 非 transient 属性都可以被持久化,除非用@Transient注解。

默认情况下,所有属性都用 @Basic 注解。

public transient int counter; //transient property

private String firstname; //persistent property
@Transient
String getLengthInMeter() { ... } //transient property
String getName() {... } // persistent property
@Basic
int getLength() { ... } // persistent property
@Basic(fetch = FetchType.LAZY)
String getDetailedComment() { ... } // persistent property
@Temporal(TemporalType.TIME)
java.util.Date getDepartureTime() { ... } // persistent property
@Enumerated(EnumType.STRING)
Starred getNote() { ... } //enum persisted as String in database

上述代码中 counter, lengthInMeter 属性将忽略不被持久化,而 firstname, name, length 被定义为可持久化和可获取的。

@TemporalType.(DATE,TIME,TIMESTAMP) 分别Map java.sql.(Date, Time, Timestamp).

@Lob 注解属性将被持久化为 Blog 或 Clob 类型。具体的java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 Clob 类型. java.sql.Blob, Byte[], byte[] 和 serializable type 将被持久化为 Blob 类型。

@Lob
public String getFullText() {
?? return fullText;? // clob type
}


@Lob
public byte[] getFullCode() {
? return fullCode;? // blog type
}

@Column 注解将属性映射到列。

@Entity
public class Flight implements Serializable {
?? ...
?? @Column(updatable = false, name = "flight_name", nullable = false, length=50)
?? public String getName() { ... }

定义 name 属性映射到 flight_name column, not null, can't update, length equal 50

@Column(
?? name="columnName"; (1) 列名
?? boolean unique() default false; (2)??? 是否在该列上设置唯一约束
?? boolean nullable() default true; (3)?? 列可空?
?? boolean insertable() default true; (4) 该列是否作为生成 insert语句的一个列
?? boolean updatable() default true; (5)? 该列是否作为生成 update语句的一个列
?? String columnDefinition() default ""; (6)? 默认值
?? String table() default ""; (7)???????????? 定义对应的表(deault 是主表)
?? int length() default 255; (8)????????????? 列长度
?? int precision() default 0; // decimal precision (9)? decimal精度
?? int scale() default 0; // decimal scale??????? (10)? decimal长度

嵌入式对象(又称组件)也就是别的对象定义的属性

组件类必须在类一级定义 @Embeddable 注解。在特定的实体关联属性上使用 @Embeddable 和 @AttributeOverride 注解可以覆盖该属性对应的嵌入式对象的列映射。

@Entity
public class Person implements Serializable {
?? // Persistent component using defaults
?? Address homeAddress;
?? @Embedded
?? @AttributeOverrides( {
????? @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
????? @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
?? } )
?? Country bornIn;
?? ...
}

@Embeddable
public class Address implements Serializable {
?? String city;
?? Country nationality; //no overriding here
}

@Embedd