jpa注解手册.docx

上传人:b****8 文档编号:10324078 上传时间:2023-02-10 格式:DOCX 页数:25 大小:27.20KB
下载 相关 举报
jpa注解手册.docx_第1页
第1页 / 共25页
jpa注解手册.docx_第2页
第2页 / 共25页
jpa注解手册.docx_第3页
第3页 / 共25页
jpa注解手册.docx_第4页
第4页 / 共25页
jpa注解手册.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

jpa注解手册.docx

《jpa注解手册.docx》由会员分享,可在线阅读,更多相关《jpa注解手册.docx(25页珍藏版)》请在冰豆网上搜索。

jpa注解手册.docx

jpa注解手册

核心提示:

JPA注解的几个要点

1.设置Pojo为实体@Entity//标识这个pojo是一个jpa实体publicclassUsersimplementsSerializable{}

2.设置表名@Entity@Table(name=users)//指定表名为userspublicclassUsersimplementsSerializable{}

3.设置主键public

JPA注解的几个要点

1.设置Pojo为实体

@Entity//标识这个pojo是一个jpa实体

publicclassUsersimplementsSerializable{

}

2.设置表名

@Entity

@Table(name="users")//指定表名为users

publicclassUsersimplementsSerializable{

}

3.设置主键

publicclassUsersimplementsSerializable{

@Id

privateStringuserCode;

4.设置字段类型

通过@Column注解设置,包含的设置如下

.name:

字段名

.unique:

是否唯一

.nullable:

是否可以为空

.inserttable:

是否可以插入

.updateable:

是否可以更新

.columnDefinition:

定义建表时创建此列的DDL

.secondaryTable:

从表名。

如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。

@Column(name="user_code",nullable=false,length=32)//设置属性userCode对应的字段为user_code,长度为32,非空

privateStringuserCode;

@Column(name="user_wages",nullable=true,precision=12,scale=2)//设置属性wages对应的字段为user_wages,12位数字可保留两位小数,可以为空

privatedoublewages;

@Temporal(TemporalType.DATE)//设置为时间类型

privateDatejoinDate;

5.字段排序

在加载数据的时候可以为其指定顺序,使用@OrderBy注解实现

@Table(name="USERS")

publicclassUser{

@OrderBy(name="group_nameASC,nameDESC")

privateListbooks=newArrayList();

}

6.主键生成策略

publicclassUsersimplementsSerializable{

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)//主键自增,注意,这种方式依赖于具体的数据库,如果数据库不支持自增主键,那么这个类型是没法用的

@Column(name="user_id",nullable=false)

privateintuserId;

publicclassUsersimplementsSerializable{

@Id

@GeneratedValue(strategy=GenerationType.TABLE)//通过一个表来实现主键id的自增,这种方式不依赖于具体的数据库,可以解决数据迁移的问题

@Column(name="user_code",nullable=false)

privateStringuserCode;

publicclassUsersimplementsSerializable{

@Id

@GeneratedValue(strategy=GenerationType.SEQUENCE)//通过Sequence来实现表主键自增,这种方式依赖于数据库是否有SEQUENCE,如果没有就不能用

@SequenceGenerator(name="seq_user")

@Column(name="user_id",nullable=false)

privateintuserId;

7.一对多映射关系

有T_One和T_Many两个表,他们是一对多的关系,注解范例如下

主Pojo

@Entity

@Table(name="T_ONE")

publicclassOneimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

@Id

@Column(name="ONE_ID",nullable=false)

privateStringoneId;

@Column(name="DESCRIPTION")

privateStringdescription;

@OneToMany(cascade=CascadeType.ALL,mappedBy="oneId")//指向多的那方的pojo的关联外键字段

privateCollectionmanyCollection;

子Pojo

@Entity

@Table(name="T_MANY")

publicclassManyimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

@Id

@Column(name="MANY_ID",nullable=false)

privateStringmanyId;

@Column(name="DESCRIPTION")

privateStringdescription;

@JoinColumn(name="ONE_ID",referencedColumnName="ONE_ID")//设置对应数据表的列名和引用的数据表的列名

@ManyToOne//设置在“一方”pojo的外键字段上

privateOneoneId;

8.多对多映射关系

貌似多对多关系不需要设置级联,以前用hibernate的时候着实为多对多的级联头疼了一阵子,JPA的多对多还需要实际的尝试一下才能有所体会。

估计JPA的多对多也是可以转换成两个一对多的。

第一个Pojo

@Entity

@Table(name="T_MANYA")

publicclassManyAimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

@Id

@Column(name="MANYA_ID",nullable=false)

privateStringmanyaId;

@Column(name="DESCRIPTION")

privateStringdescription;

@ManyToMany

@JoinTable(name="TMANY1_TMANY2",

joinColumns={@JoinColumn(name="MANYA_ID",referencedColumnName="MANYA_ID")},

inverseJoinColumns={@JoinColumn(name="MANYB_ID",referencedColumnName="MANYB_ID")})

privateCollectionmanybIdCollection;

第二个Pojo

@Entity

@Table(name="T_MANYB")

publicclassManyBimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

@Id

@Column(name="MANYB_ID",nullable=false)

privateStringmanybId;

@Column(name="DESCRIPTION")

privateStringdescription;

@ManyToMany(mappedBy="manybIdCollection")

privateCollectionmanyaIdCollection;

9.一对一映射关系

主Pojo

@Entity

@Table(name="T_ONEA")

publicclassOneAimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

@Id

@Column(name="ONEA_ID",nullable=false)

privateStringoneaId;

@Column(name="DESCRIPTION")

privateStringdescription;

@OneToOne(cascade=CascadeType.ALL,mappedBy="oneA")//主Pojo这方的设置比较简单,只要设置好级联和映射到从Pojo的外键就可以了。

privateOneBoneB;

从Pojo

@Entity

@Table(name="T_ONEB")

publicclassOneBimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

@Id

@Column(name="ONEA_ID",nullable=false)

privateStringoneaId;

@Column(name="DESCRIPTION")

privateStringdescription;

@JoinColumn(name="ONEA_ID",referencedColumnName="ONEA_ID",insertable=false,updatable=false)//设置从方指向主方的关联外键,这个ONEA_ID其实是表T_ONEA的主键

@OneToOne

privateOneAoneA;

10大字段

@Lob//对应Blob字段类型

@Column(name="PHOTO")

privateSerializablephoto;

@Lob//对应Clob字段类型

@Column(name="DESCRIPTION")

privateStringdescription;

11.瞬时字段

不需要与数据库映射的字段,在保存的时候不需要保存倒数据库

@Transient

privateinttempValue;

publicintgetTempValue(){

gettempValue;

}

publicvoidsetTempValue(intvalue){

this.tempValue=value;

}

Java代码

@Entity--声明为一个实体bean

@Table(name="promotion_info")--为实体bean映射指定表(表名="promotion_info)

@Id--声明了该实体bean的标识属性

@GeneratedValue--可以定义标识字段的生成策略.

@Transient--将忽略这些字段和属性,不用持久化到数据库

@Column(name="promotion_remark")--声明列(字段名="promotion_total")属性还包括(length=200等)

@Temporal(TemporalType.TIMESTAMP)--声明时间格式

@Enumerated--声明枚举

@Version--声明添加对乐观锁定的支持

@OneToOne--可以建立实体bean之间的一对一的关联

@OneToMany--可以建立实体bean之间的一对多的关联

@ManyToOne--可以建立实体bean之间的多对一的关联

@ManyToMany--可以建立实体bean之间的多对多的关联

@Formula--一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)

@Entity

@Table(name="promotion_info")

publicclassPromotionimplementsSerializable{

//AUTO--可以是identity类型的字段,或者sequence类型或者table类型,取决于不同的底层数据库

@Id

@GeneratedValue(strategy=GenerationType.AUTO)

privateLongid;

@Column(name="group_start_amount")

privateIntegergroupStartAmount=0;

@Column(name="promotion_remark",length=200)

//@Lob如果是文章内容可以使用只需要把length=200去掉就可以了

privateStringremark;

//DATE-java.sql.Date

//TIME-java.sql.Time

//TIMESTAMP-java.sql.Timestamp

@Temporal(TemporalType.TIMESTAMP)

@Column(name="start_time")

privateDatestartTime;

//显示0隐藏1

publicstaticenumDisplayType{

显示,隐藏

}

@Enumerated(value=EnumType.ORDINAL)//ORDINAL序数

privateDisplayTypedisplayType=DisplayType.显示;

@Version

privateIntegerversion;

//CascadeType.PERSIST--触发级联创建(create)

//CascadeType.MERGE--触发级联合并(update)

//FetchType.LAZY--延迟加载

@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.LAZY)

privatePromotionGrouppromotionGroup;

//单向ManyToMany

//@JoinTable(关联的表名)

//joinColumns--promotion关联的列的外键

//inverseJoinColumns--largess关联列的外键

@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})

@JoinTable(name="promotion_largess",

joinColumns={@JoinColumn(name="promotion_id")},

inverseJoinColumns={@JoinColumn(name="largess_id")})

privateSetlargess;

//getset省略....

}

@Entity

@Table(name="promotion_group")

publicclassPromotionGroupimplementsSerializable{

@Id

@GeneratedValue(strategy=GenerationType.AUTO)

privateLongid;

//mappedBy的值"promotionGroup"指向owner(Promotion)端的关联属性,并且是双向关系

@OneToMany(mappedBy="promotionGroup",cascade=CascadeType.ALL)

privateListpromotion;

//getset省略....

}

@Entity

@Table(name="largess")

publicclassLargessimplementsSerializable{

@Id

@GeneratedValue(strategy=GenerationType.AUTO)

privateLongid;

//1.sql语句中的字段和表名都应该和数据库相应,而不是类中的字段,

//若带有参数如la.id=id,这个=id才是类中属性

//2.操作字段一定要用别名

@Formula(selectmax(la.id)fromlargessasla)

privateintmaxId;

@Formula(selectCOUNT(la.id)fromlargessla)

privateintcount;

@Transient

privateStringimg

//getset省略....

}

JPA注解使用说明

一.概述

@authorliuguangyi

@contentejb3注解的API定义在javax.persistence.*包里面。

注释说明:

@Entity——将一个类声明为一个实体bean(即一个持久化POJO类)

@Id——注解声明了该实体bean的标识属性(对应表中的主键)。

@Table——注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字

@Column——注解声明了属性到列的映射。

该注解有如下的属性

name可选,列名(默认值是属性名)

unique可选,是否在该列上设置唯一约束(默认值false)

nullable可选,是否设置该列的值可以为空(默认值false)

insertable可选,该列是否作为生成的insert语句中的一个列(默认值true)

updatable可选,该列是否作为生成的update语句中的一个列(默认值true)

columnDefinition可选,为这个特定列覆盖sqlddl片段(这可能导致无法在不同数据库间移植)

table可选,定义对应的表(默认为主表)

length可选,列长度(默认值255)

precision可选,列十进制精度(decimalprecision)(默认值0)

scale可选,如果列十进制数值范围(decimalscale)可用,在此设置(默认值0)

@GeneratedValue——注解声明了主键的生成策略。

该注解有如下属性

strategy指定生成的策略(JPA定义的),这是一个GenerationType。

默认是GenerationType.AUTO

GenerationType.AUTO主键由程序控制

GenerationType.TABLE使用一个特定的数据库表格来保存主键

GenerationType.IDENTITY主键由数据库自动生成(主要是自动增长类型)

GenerationType.SEQUENCE根据底层数据库的序列来生成主键,条件是数据库支持序列。

(这个值要与generator一起使用)

generator指定生成主键使用的生成器(可能是orcale中的序列)。

@SequenceGenerator——注解声明了一个数据库序列。

该注解有如下属性

name表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中

sequenceName表示生成策略用到的数据库序列名称。

initialValue表示主键初始值,默认为0.

allocationSize每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.

@GenericGenerator——注解声明了一个hibernate的主键生成策略。

支持十三种策略。

该注解有如下属性

name指定生成器名称

strategy指定具体生成器的类名(指定生成策略)。

parameters得到strategy指定的具体生成器所用到的参数。

其十三种策略(strategy属性的值)如下:

1.native对于orcale采用Sequence方式,对于MySQL和SQLServer采用identity(处境主键生成机制),

native就是将主键的生成工作将由数据库完成,hibernate不管(很常用)

例:

@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="native")

2.uuid采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。

占用空间大(字符串类型)。

例:

@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="uuid")

3.hilo要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用)

例:

@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strateg

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1