Entity
Bean
非常简单,比起普通的
java bean
仅仅
多了些注释
。
注:entity bean 需要在网络上传送时必须实现Serializable 接口,否则将引发java.io.InvalidClassException例外。
@Entity
:
指明这是一个Entity
Bean
@Table
:
指定了
entity bean
所要映射的数据库表,其中
@Table(name=”XXX”)
用来指定映射表的表名。如果
@Table
没有使用name属性,系统默认采用类名作为映射表的表名
。
@Column
:
定义了将成员属性映射到关系表中的哪一列和该列的一些结构信息(如列名是否
唯一,是否允许为空,是否允许更新等
),他的属性介绍如下:
·
name
:
映射的列名。如:映射
Person
表的
PersonName
列,可以在
name
属性的
getName
方法上面加入
@Column(name = "PersonName")
,如果不指定映射列名,容器将属性名称作为默认的映射列名。
·
unique
:
是否唯一
·
nullable
:
是否允许为空
·
length
:
对于字符型列,
length
属性指定列的最大字符长度
·
insertable
:
是否允许插入
·
updatable
:
是否允许更新
·
columnDefinition
:
定义建表时创建此列的
DDL
·
secondaryTable
:
从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
@Id
:
指定表的主键。
@GeneratedValue
:
定义了ID的生成方式
,它可以有下列多种生成方式
。
·
TABLE
:容器指定用底层的数据表确保唯一。例子代码如下:
@TableGenerator
(name=
"
Person_GENERATOR
"
,
//
为该生成方式取个名称
table=
"Person_IDGenerator"
,
//
生成ID的表
pkColumnName=
"PRIMARY_KEY_COLUMN"
,
//
主键列的名称
valueColumnName=
"VALUE_COLUMN"
,
//
存放生成ID值的列的名称
pkColumnValue=
"
personid
"
,
//
主键列的值(定位某条记录)
allocationSize=1)
//
递增值
@Id
@GeneratedValue
(strategy=GenerationType.
TABLE
, generator=
"
Person_GENERATOR
"
)
public
Integer getPersonid() {
return
personid
;
}
·
SEQUENCE
:使用数据库的
SEQUENCE
列来保证唯一
(Oralce
数据库通过序列来生成唯一
ID)
,例子代码如下:
@
SequenceGenerator(name=
"Person_SEQUENCE"
,
//
为该生成方式取个名称
sequenceName=
"Person_SEQ"
)
//sequence
名称(若不存在,会自动生成)
public class
Person
implements
Serializable{
@Id
@GeneratedValue
(strategy=GenerationType.
SEQUENCE
, generator=
"Person_SEQ"
)
public
Integer getPersonid() {
return
personid
;
}
·
IDENTITY
:使用数据库的
INDENTIT
列来保证唯一
(
像
mysql
,
sqlserver
数据库通过自增长来生成唯一
ID)
·
AUTO
:由容器挑选一个合适的方式来保证唯一
(
由容器决定采用何种方式生成唯一主键,
hibernate
会根据数据库类型选择适合的生成方式,相反
toplink
就不是很近人情
)
·
NONE
:容器不负责主键的生成,由调用程序来完成。
@Temporal
:
用来指定
java.util.Date
或
java.util.Calendar
属性与数据库类型
date,time
或
timestamp
中的那一种类型进行映射。
@Temporal
有三种类型:
DATE
, //
代表
date
类型
TIME
, //
代表时间类型
TIMESTAMP
//
代表时间戳类型
例如:
@Temporal
(value=TemporalType.
DATE
)
public
Date getBirthday() {
return
birthday
;
}
在
Jboss
中可以缺少
@Temporal
注释,但在使用了
TopLink
的服务器中,缺少该注释将会导致部署失败。
@Temporal
注释的默认值为:
TIMESTAMP
@Transient
:
如果不想让一些成员属性映射成数据库字段,我们可以使用
@Transient
注释进行标注,下面的
fullName
属性将不会被持久化成数据库字段
@
Transient
public
String getFullName() {
return firstName +
“
,
”
+ lastName;
}
@Enumerated
:
如果想映射枚举对象到数据库就需要使用
@Enumerated
注释进行标注。如:
public enum
CommentType {
NEWS
{
public
String getName(){
return
"
资讯评论"
;}},
PRODUCT
{
public
String getName(){
return
"
产品评论"
;}};
public abstract
String getName();
}
Public class EntityBeanA{
@Enumerated(EnumType.
STRING
)
public
CommentType
getType() {
return
type
;
}
。。。
}
@Lob
:
有些时候你可能需要存放一些文件或大文本数据进数据库(例如在做新闻系统时,我们通常会使用到大文本数据),
JDBC
使用
j
ava.sql.Blob
类型存放二进制数据,
java.sql.Clob
类型存放字符数据
,这些数据都是非常占内存的,
@Lob
注释用作映射这些大数据类型,当属性的类型为
byte[], Byte[]
或
java.io.Serializable
时,
@Lob
注释将映射为数据库的
Blob
类型,当属性的类型为
char[],
Character[]
或
java.lang.String
时,
@Lob
注释将映射为数据库的
Clob
类型
例子:
@Lob
@Basic(fetch=FetchType.LAZY)
public
String getContent() {
return
content
;
}
@Basic
:
对于加了
@Lob
注释的大数据类型
(
有时存放的可能是
10M
以上的数据
)
,为了避免每次加载实体时占用大量内存,我们有必要对该属性进行延时加载,这时我们需要用到
@Basic
注释。