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