具有orm元数据的领域对象称为实体(entity),按jpa的规范,实体具备以下的条件:
- 必须使用javax.persistence.entity注解或者在xml映射文件中有对应的元素;
- 必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final;
- 如果游离状的实体对象需要以值的方式进行传递,如通session bean的远程业务接口传递,则必须实现serializable接口;
- 需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。
对于继承的实体,在javax.persistence.inheritancetype定义了3种映射策略,:
single_table:父子类都保存到同一个表中,通过字段值进行区分。这是我们topic实体所采用的策略,topic和polltopic都保存到同一张表中,通过topic_type字段进行区分,topic在t_topic表中对应topic_type=1的记录,而polltopic对应 topic_type=2的记录(稍后在polltopic实体中指定);区别的字段通过@discriminatorcolumn说明,区分字段对应该实体的值通过@discriminatorvalue指定;
joined:父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据;
table_per_class:每一个类对应自己的表,一般不推荐采用这种方式。
1、@entity(name="entityname")
必须,name为可选,对应数据库中一的个表
2、@table(name="",catalog="",schema="")
可选,通常和@entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息
name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
catalog:可选,表示catalog名称,默认为catalog("").
schema:可选,表示schema名称,默认为schema("").
3、@id
必须
@id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.置于getxxxx()前.
4、@generatedvalue(strategy=generationtype,generator="")
可选
strategy:表示主键生成策略,有auto,indentity,sequence 和 table 4种,分别表示让orm框架自动选择,
根据数据库的identity字段生成,根据数据库表的sequence字段生成,以有根据一个额外的表生成主键,默认为auto
generator:表示主键生成器的名称,这个属性通常和orm框架相关,例如,hibernate可以指定uuid等主键生成方式.
示例:
@id
@generatedvalues(strategy=strategytype.sequence)
public int getpk() {
return pk;
}
5、@basic(fetch=fetchtype,optional=true)
可选
@basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getxxxx()方法,默认即为@basic
fetch: 表示该属性的读取策略,有eager和lazy两种,分别表示主支抓取和延迟加载,默认为eager.
optional:表示该属性是否允许为null,默认为true
示例:
@basic(optional=false)
public string getaddress() {
return address;
}
6、@column
可选
@column描述了数据库表中该字段的详细定义,这对于根据jpa注解生成数据库表结构的工具非常有作用.
name:表示数据库表中该字段的名称,默认情形属性名称一致
nullable:表示该字段是否允许为null,默认为true
unique:表示该字段是否是唯一标识,默认为false
length:表示该字段的大小,仅对string类型的字段有效
insertable:表示在orm框架执行插入操作时,该字段是否应出现insetrt语句中,默认为true
updateable:表示在orm框架执行更新操作时,该字段是否应该出现在update语句中,默认为true.对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段.
columndefinition:表示该字段在数据库中的实际类型.通常orm框架可以根据属性类型自动判断数据库中字段的类型,但是对于date类型仍无法确定数据库中字段类型究竟是date,time还是timestamp.此外,string的默认映射类型为varchar,如果要将string类型映射到特定数据库的blob或text字段类型,该属性非常有用.
示例:
@column(name="birth",nullable="false",columndefinition="date")
public string getbithday() {
return birthday;
}
7、@transient
可选
@transient表示该属性并
此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com
非一个到 数据库 表的字段的映射 ,orm 框架将忽略该属性 .如果一个属性并非数据库表的字段映射,就务必将其标示为@transient,否则,orm框架默认其注解为@basic
示例:
//根据birth计算出age属性
@transient
public int getage() {
return getyear(new date()) - getyear(birth);
}
8、@manytoone(fetch=fetchtype,cascade=cascadetype)
可选
@manytoone表示一个多对一的映射,该注解标注的属性通常是数据库表的外键
optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true
fetch:表示抓取策略,默认为fetchtype.eager
cascade:表示默认的级联操作策略,可以指定为all,persist,merge,refresh和remove中的若干组合,默认为无级联操作
targetentity:表示该属性关联的实体类型.该属性通常不必指定,orm框架根据属性类型自动判断targetentity.
示例:
//订单order和用户user是一个manytoone的关系
//在order类中定义
@manytoone()
@joincolumn(name="user")
public user getuser() {
return user;
}
9、@joincolumn
可选
@joincolumn和@column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@manytoone的字段.
name:该字段的名称.由于@joincolumn描述的是一个关联字段,如manytoone,则默认的名称由其关联的实体决定.
例如,实体order有一个user属性来关联实体user,则order的user属性为一个外键,
其默认的名称为实体user的名称+下划线+实体user的主键名称
示例:
见@manytoone
10、@onetomany(fetch=fetchtype,cascade=cascadetype)
可选
@onetomany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.
fetch:表示抓取策略,默认为fetchtype.lazy,因为关联的多个对象通常不必从数据库预先读取到内存
cascade:表示级联操作策略,对于onetomany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除
例如:实体user和order是onetomany的关系,则实体user被删除时,其关联的实体order也应该被全部删除
示例:
@onetymany(cascade=all)
public list getorders() {
return orders;
}
11、@onetoone(fetch=fetchtype,cascade=cascadetype)
可选
@onetoone描述一个一对一的关联
fetch:表示抓取策略,默认为fetchtype.lazy
cascade:表示级联操作策略
示例:
@onetoone(fetch=fetchtype.lazy)
public blog getblog() {
return blog;
}
12、@manytomany
可选
@manytomany 描述一个多对多的关联.多对多关联上是两个一对多关联,但是在manytomany描述中,中间表是由orm框架自动处理
targetentity:表示多对多关联的另一个实体类的全名,例如:package.book.class
mappedby:表示多对多关联的另一个实体类的对应集合属性名称
示例:
user实体表示用户,book实体表示书籍,为了描述用户收藏的书籍,可以在user和book之间建立manytomany关联
@entity
public class user {
private list books;
@manytomany(targetentity=package.book.class)
public list getbooks() {
return books;
}
public void setbooks(list books) {
this.books=books;
}
}
@entity
public class book {
private list users;
@manytomany(targetentity=package.users.class, mappedby="books")
public list getusers() {
return users;
}
public void setusers(list users) {
this.users=users;
}
}
两个实体间相互关联的属性必须标记为@manytomany,并相互指定targetentity属性,
需要注意的是,有且只有一个实体的@manytomany注解需要指定mappedby属性,指向targetentity的集合属性名称
利用orm工具自动生成的表除了user和book表外,还自动生成了一个user_book表,用于实现多对多关联
13、@mappedsuperclass
可选
@mappedsuperclass可以将超类的jpa注解传递给子类,使子类能够继承超类的jpa注解
示例:
@mappedsuperclass
public class employee() {
....
}
@entity
public class engineer extends employee {
.....
}
@entity
public class manager extends employee {
.....
}
14、@embedded
可选
@embedded将几个字段组合成一个类,并作为整个entity的一个属性.
例如user包括id,name,city,street,zip属性.
我们希望city,street,zip属性映射为address对象.这样,user对象将具有id,name和address这三个属性.
address对象必须定义为@embededable
示例:
@embeddable
public class address {city,street,zip}
@entity
public class user {
@embedded
public address getaddress() {
&n
转自: http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E9%97%AE%E7%AD%94/8337.shtml