JPA注解学习总结


具有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: 表示该属性的读取策略,eagerlazy两种,分别表示主支抓取和延迟加载,默认为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类型映射到特定数据库blobtext字段类型,该属性非常有用.

示例:

    @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,refreshremove中的若干组合,默认为无级联操作

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,orderuser属性为一个外键,

其默认的名称为实体user的名称+下划线+实体user的主键名称

示例:

    @manytoone

 

10@onetomany(fetch=fetchtype,cascade=cascadetype)

可选

@onetomany描述一个一对多的关联,该属性应该为集体类型,数据库中并没有实际字段.

fetch:表示抓取策略,默认为fetchtype.lazy,因为关联的多个对象通常不必从数据库预先读取到内存

cascade:表示级联操作策略,对于onetomany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除

例如:实体userorderonetomany的关系,则实体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实体表示书籍,为了描述用户收藏的书籍,可以在userbook之间建立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工具自动生成的表除了userbook表外,还自动生成了一个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,nameaddress这三个属性.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值