Hibernate-----Hibernate注解
可用Hibernate的映射文件代替
注解API定义在javax.persistence.*包里面
@Entity
将一个类声明为一个实体bean(即一个持久化POJO类)
name:指定数据库表的名字
@Table
声明该实体bean映射指定的表;表示实体对应的数据库表的信息,通常和@Entity使用
name:表的名字(默认和实体名一致)
catalog:Catalog的名称(默认Catalog(“”))
schema:Schema的名称(默认Schema(“”))
@Id
声明该实体bean的标识属性(对应表中的主键);一个实体只能有一个属性被映射为主键
@Column
声明属性到列的映射;描述了数据库表中该字段的详细定义
name:列名(默认值是属性名)
unique:该列是否唯一约束(默认值false)
nullable:该列的值是否可为空(默认值true)
insertable:该列是否作为生成的insert语句中的一个列(默认值true)
updatable:该列是否作为生成的update语句中的一个列(默认值true);对于已经创建就不可更改的字段,该属性非常有用,如birthday字段
columnDefinition:表示该字段在数据库中的实际类型,通常ORM框架可根据属性类型自动判断数据库中字段的类型,但对于Date类型仍无法确定数据库中字段类型究竟是DATE
TIME还是TIMESTAMP;此外,String的默认映射类型为VARCHAR,若要将String类型映射到特定数据库的BLOB或TEXT字段类型;该属性非常有用;(为这个特定列覆盖sqlddl片段:这可能导致无法在不同数据库间移植)
table:定义对应的表(默认为主表)
length:列长度(默认值255);仅对String类型的字段有效
precision:列十进制精度(decimalprecision)(默认值0)
scale:如果列十进制数值范围(decimalscale)可用,在此设置(默认值0)
@GeneratedValue
声明主键的生成策略
strategy:指定生成的策略(JPA定义的,这是一个GenerationType)
AUTO:让ORM框架自动选择(默认)
TABLE:使用一个特定的数据库表来保存主键
IDENTITY:根据数据库表的Identity字段生成;
SEQUENCE:根据数据库表的Sequecne字段生成;(与generator一起使用)
generator指定生成主键使用的生成器(可能是orcale中的序列)
@Id @GeneratedValue(strategy=StrategyType.SEQUENCE) public int getPk(){ return pk; }
@SequenceGenerator
声明一个数据库序列
name:该表主键生成策略名称,它被引用在@GeneratedValue的“gernerator”值中
sequenceName:生成策略用到的数据库序列名称
initialValue:主键初始值(默认0)
allocationSize:每次主键值增加的大小(默认50)
@GenericGenerator
声明一个hibernate的主键生成策略
name:指定生成器名称
strategy:指定具体生成器的类名(指定生成策略)
parameters:得到strategy指定的具体生成器所用到的参数
十三种策略(strategy属性的值)如下:
1)、native
@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="native")
2)、uuid:采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。
占用空间大(字符串类型)
3)、hilo
4)、assigned:<generator>元素没指定时的默认生成策略。等同于JPA中的AUTO
5)、identity
6)、select:使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)
7)、sequence:要设定序列名,不然hibernate无法找到
@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="sequence",
parameters={@Parameter(name="sequence",value="seq_payablemoney")})
8)、seqhilo通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence
的数据库 (比较少用)
@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="seqhilo",
parameters={@Parameter(name="max_lo",value="5")})
9)、increnment
10)、foreign使用另一个相关的对象的主键。通常和<one-to-one>联合起来使用
@Id
@GeneratedValue(generator="idGenerator")
@GenericGenerator(name="idGenerator",strategy="foreign",
parameters={@Parameter(name="property",value="info")})
Integerid;
@OneToOne
EmployeeInfoinfo;
11)、guid:采用数据库底层的guid算法机制,对应MySQL的uuid()函数,SQLServer的newid()
函数,ORCALE的rawtohex(sys_guid())函数等
12)、uuid.hex
13)、sequence-identitysequence策略的扩展,采用立即检索策略来获取sequence值,需
要JDBC3.0和JDK4以上(含1.4)版本
@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="sequence-identity",
parameters={@Parameter(name="sequence",value="seq_payablemoney")})
@Transient
表示该属性并非一个岛数据库表的字段的映射,ORM框架将忽略该属性
// 根据birth计算出age属性
@Transient
Public int getAge(){
return getYear(new Date())-getYear(bith);
}
@Basic
表示一个简单的属性岛数据库表的字段的映射,对于没有任何标注的getXxx()方法,默认即为@Basic
fetch:该属性的读取策略(EAGER:主支抓取;默认,LAZY:延迟加载)
optional:该属性是否允许为null(默认true)
@OneToOne
一对一关联的映射
cascade:级联操作策略(默认无级联操作);
PERSIST:级联新建
REMOVE:级联删除
REFRESH:级联刷新
MERGE:级联更新
ALL:全部四项
组合
方法一
主表:@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn
public从表类get从表类(){return从表对象}
从表:没有主表类
注意:这种方法要求主表与从表的主键值相对应
方法二
主表:@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="主表外键") //这里指定的是数据库中的外键字段
public从表类get从表类(){return从表类}
从表:@OneToOne(mappedBy="主表类中的从表属性") //例主表User中有一个从表属性是Heart类型的heart,这里就填heart
public主表类get主表类(){return主表对象}
注意:@JoinColumn是可选的。默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。
方法三
主表:@OneToOne(cascade=CascadeType.ALL)
@JoinTable(name="关联表名",
joinColumns=@JoinColumn(name="主表外键"),
inverseJoinColumns=@JoinColumns(name="从表外键"))
从表:@OneToOne(mappedBy="主表类中的从表属性") //例主表User中有一个从表属性是Heart类型的heart,这里就填heart
public主表类get主表类(){return主表对象}
@ManyToOne
多对一关联的映射;该注解标注的属性通常是数据库表的外键
fetch:抓取策略;指定是否延迟加载(LAZY:延迟加载,默认;EAGER:立即加载)
optional:是否允许该字段为null;该属性应该根据数据库表的外键约束来确定(默认为true)
cascade:
targetEntity:另一个实体类的全限定名;通常不必指定,ORM框架根据属性类型自动判断
方法一
@ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="外键名")
public主表类get主表类(){return主表对象}
方法二
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name="关联表名",
joinColumns=@JoinColumn(name="主表外键"),
inverseJoinColumns=@JoinColumns(name="从表外键")
)
@JoinColumn
和@Column类似,这里描述的不是一个简单字段,而是一个关联字段;如描述一个@ManyToOne的字段
name:该字段的名称,(默认名称:关联实体名_关联实体的主键名)
如实体Order有一个user属性来关联实体User,则Order的user属性为一个外键;其默认的名称为【实体User的名称_实体User的主键名称】
@OneToMany
设置一对多关联。该属性应该为集体类型,在数据库中并没有实际字段
cascade:对于OnewToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除
fetch:
mappedBy:只有OneToOne、OneToMany、ManyToMany上才有该属性;该属性指向关系的维护端(维护级联关系)
方法一
@OneToMany(mappedBy="‘多端‘的属性")
publicList<“多端”类>get“多端”列表(){return“多端”列表}
使用这种配置,在为“一端”添加“多端”时,不会修改“多端”的外键。在“一端”加载时,不会得到“多端”。如果使用延迟加载,在读“多端”列表时会出异常,立即加载在得到多端时,是一个空集合(集合元素为0)
方法二
@OneToMany(mappedBy="“多端”的属性")
@MapKey(name="“多端”做为Key的属性")
publicMap<“多端”做为Key的属性的类,主表类>get“多端”列表(){return“多端”列表}
方法三
@OneToMany
@JoinColumn(name="“多端外键")
publicList<“多端类>get“多端列表(){return“多端列表}
使用这种配置,在为“一端”添加“多端”时,可以修改“多端”的外键。
“一端”配置
@ManyToMany
设置多对多的关联映射;中间表由ORM框架自动处理
targetEntity:
mappedBy:另一个实体类的对应集合属性名称
User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍
@Entity
public class User {
private List books;
@ManyToMany(targetEntity=package.Book.class)
public List getBooks() {
return books;
}
}
@Entity
public class Book {
private List users;
@ManyToMany(targetEntity=package.Users.class,mappedBy="books")
public List getUsers() {
return users;
}
}
两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性,有且只有一个实体的@ManyToMany注解需指定mappedBy属性
利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联
Hibernate验证注解
注解 |
适用类型 |
说明 |
示例 |
@Pattern |
String |
通过正则表达式来验证字符串 |
@attern(regex=”[a-z]{6}”) |
@Length |
String |
验证字符串的长度 |
@length(min=3,max=20) |
|
String |
验证一个Email地址是否有效 |
|
@Range |
Long |
验证一个整型是否在有效的范围内 |
@Range(min=0,max=100) |
@Min |
Long |
验证一个整型必须不小于指定值 |
@Min(value=10) |
@Max |
Long |
验证一个整型必须不大于指定值 |
@Max(value=20) |
@Size |
集合或数组 |
集合或数组的大小是否在指定范围内 |
@Size(min=1,max=255) |
以上每个注解都可能有一个message属性,用于在验证失败后向用户返回的消息
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。