一.实体Bean
每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明。
声明实体Bean
- @Entity
public class Flightimplements 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 Skyimplements Serializable {
…
@Table 注解包含一个schema和一个catelog属性,使用@UniqueConstraints 可以定义表的唯一约束。
@Table(name=”tbl_sky”,
uniqueConstraints ={@UniqueConstraint(columnNames={“month”, “day”})}
)
上述代码在 “month” 和 “day” 两个 field 上加上unique constrainst.
@Version 注解用于支持乐观锁版本控制。
@Entity
public class Flightimplements Serializable {
…
@Version
@Column(name=”OPTLOCK”)
public Integer getVersion() { … }
}
version属性映射到 “OPTLOCK” 列,entity manager 使用这个字段来检测冲突。一般可以用数字或者 timestamp 类型来支持 version.
实体Bean中所有非static 非 transient 属性都可以被持久化,除非用@Transient注解。
默认情况下,所有属性都用 @Basic 注解。
public transient intcounter; //transient property
private Stringfirstname; //persistent property
@Transient
StringgetLengthInMeter() { … } //transient property
String getName() {…} // persistent property
@Basic
int getLength() { …} // persistent property
@Basic(fetch =FetchType.LAZY)
StringgetDetailedComment() { … } // persistent property
@Temporal(TemporalType.TIME)
java.util.DategetDepartureTime() { … } // 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 StringgetFullText() {
return fullText; // clob type
}
@Lob
public byte[]getFullCode() {
return fullCode; // blog type
}
@Column 注解将属性映射到列。
@Entity
public class Flightimplements 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; // decimalprecision (9) decimal精度
int scale() default 0; // decimal scale (10) decimal长度
嵌入式对象(又称组件)也就是别的对象定义的属性
组件类必须在类一级定义 @Embeddable 注解。在特定的实体关联属性上使用 @Embeddable 和 @AttributeOverride 注解可以覆盖该属性对应的嵌入式对象的列映射。
@Entity
public class Personimplements 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 Addressimplements Serializable {
String city;
Country nationality; //no overriding here
}
@Embeddable
public class Countryimplements Serializable {
private String iso2;
@Column(name=”countryName”)private String name;
public String getIso2() { return iso2; }
public void setIso2(String iso2) { this.iso2= iso2; }
public String getName() { return name; }
public void setName(String name) { this.name= name; }
…
}
Person 类定义了 Address 和 Country 对象,具体两个类实现见上。
无注解属性默认值:
•属性为简单类型,则映射为@Basic
•属性对应的类型定义了@Embeddable 注解,则映射为@Embedded
•属性对应的类型实现了Serializable,则属性被映射为@Basic并在一个列中保存该对象的serialized版本。
•属性的类型为java.sql.Clob or java.sql.Blob, 则映射到 @Lob 对应的类型。
映射主键属性
@Id 注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。
• AUTO - 可以是 identity column, sequence 或者 table 类型,取决于不同底层的数据库
• TABLE - 使用table保存id值
• IDENTITY - identity column
• SEQUENCE - seque
nce
@Id@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”SEQ_STORE”)
public Integer getId(){ … }
@Id@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {… }
AUTO 生成器,适用与可移值的应用,多个@Id可以共享同一个identifier生成器,只要把generator属性设成相同的值就可以。通过@SequenceGenerator和@TableGenerator 可以配置不同的identifier 生成器。