Hibernate注释大全收藏
声明实体Bean
@Entity
public class Flight implements Serializable {
Long id;
@Id
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
}
@Entity 注解将一个类声明为实体 Bean, @Id 注解声明了该实体Bean的标识属性。
Hibernate 可以对类的属性或者方法进行注解。属性对应field类别,方法的 getXxx()对应property类别。
定义表
通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字。
@Entity
@Table(name="tbl_sky")
public class Sky implements Serializable {
...
@Table 注解包含一个schema和一个catelog 属性,使用@UniqueConstraints 可以定义表的唯一约束。
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}
)
上述代码在 "month" 和 "day" 两个 field 上加上 unique constrainst.
@Version 注解用于支持乐观锁版本控制。
@Entity
public class Flight implements Serializable {
...
@Version
@Column(name="OPTLOCK")
public Integer getVersion() { ... }
}
version属性映射到 "OPTLOCK" 列,entity manager 使用这个字段来检测冲突。 一般可以用 数字 或者timestamp 类型来支持 version.
实体Bean中所有非static 非 transient 属性都可以被持久化,除非用@Transient注解。
默认情况下,所有属性都用 @Basic 注解。
public transient int counter; //transient property
private String firstname; //persistent property
@Transient
String getLengthInMeter() { ... } //transient property
String getName() {... } // persistent property
@Basic
int getLength() { ... } // persistent property
@Basic(fetch = FetchType.LAZY)
String getDetailedComment() { ... } // persistent property
@Temporal(TemporalType.TIME)
java.util.Date getDepartureTime() { ... } // persistent property
@Enumerated(EnumType.STRING)
Starred getNote() { ... } //enum persisted as String in database
上述代码中 counter, lengthInMeter 属性将忽略不被持久化,而 firstname, name, length 被定义为可持久化和可获取的。
@TemporalType.(DATE,TIME,TIMESTAMP) 分别Map java.sql.(Date, Time, Timestamp).
@Lob 注解属性将被持久化为 Blog 或 Clob 类型。具体的java.sql.Clob, Character[], char[] 和java.lang.String 将被持久化为 Clob 类型. java.sql.Blob, Byte[], byte[] 和 serializable type 将被持久化为 Blob类型。
@Lob
public String getFullText() {
return fullText; // clob type
}
@Lob
public byte[] getFullCode() {
return fullCode; // blog type
}
@Column 注解将属性映射到列。
@Entity
public class Flight implements Serializable {
...
@Column(updatable = false, name = "flight_name", nullable = false, length=50)
public String getName() { ... }
定义 name 属性映射到 flight_name column, not null, can't update, length equal 50
@Column(
name="columnName"; (1) 列名
boolean unique() default false; (2) 是否在该列上设置唯一约束
boolean nullable() default true; (3) 列可空?
boolean insertable() default true; (4) 该列是否作为生成 insert语句的一个列
boolean updatable() default true; (5) 该列是否作为生成 update语句的一个列
String columnDefinition() default ""; (6) 默认值
String table() default ""; (7) 定义对应的表(deault 是主表)
int length() default 255; (8) 列长度
int precision() default 0; // decimal precision (9) decimal精度
int scale() default 0; // decimal scale (10) decimal长度
嵌入式对象(又称组件)也就是别的对象定义的属性
组件类必须在类一级定义 @Embeddable 注解。在特定的实体关联属性上使用 @Embeddable和@AttributeOverride 注解可以覆盖该属性对应的嵌入式对象的列映射。
@Entity
public class Person implements Serializable {
// Persistent component using defaults
Address homeAddress;
@Embedded
@AttributeOverrides( {
@AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
@AttributeOverride(name="name", column = @Column(name="bornCountryName") )
} )
Country bornIn;
...
}
@Embeddable
public class Address implements Serializable {
String city;
Country nationality; //no overriding here
}
@Embeddable
public class Country implements Serializable {
private String iso2;
@Column(name="countryName") private String name;
public String getIso2() { return iso2; }
public void setIso2(String iso2) { this.iso2 = iso2; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
...
}
Person 类定义了 Address 和 Country 对象,具体两个类实现见上。
无注解属性默认值:
? 属性为简单类型,则映射为 @Basic
? 属性对应的类型定义了 @Embeddable 注解,则映射为 @Embedded
? 属性对应的类型实现了Serializable,则属性被映射为@Basic并在一个列中保存该对象的serialized版本。
? 属性的类型为 java.sql.Clob or java.sql.Blob, 则映射到 @Lob 对应的类型。
映射主键属性
@Id 注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。
? AUTO - 可以是 identity column, sequence 或者 table 类型,取决于不同底层的数据库
? TABLE - 使用table保存id值
<p text="" javascript"="" style="margin: 0cm 0cm 0pt; padding-top: 0px; padding-bottom: 0px; text-indent: 2em; color: rgb(42, 42, 42); font-family: 'Segoe UI', Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25px; -webkit-text-size-adjust: none; background-color: rgb(245, 250, 255); ">BAIDU_CLB_fillSlot("246708");
步骤一:修改ApplicationContext配置文件
在定义Hibernate的SessionFactory时,
1.将<bean id="sessionFactory"
2.将<property name="mappingLocations" value="classpath:org/hhxy/model/*.hbm.xml"></propert>修改为
<property name="annotatedClasses">
步骤二:在Bean文件中添加注释,并且将X.hbm.xml文件删除。 示例代码如下所示:
package org.hhxy.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "Users")
public class User {
}
这样一个最基本的配置就完成了!
当然,Hibernate基于Annotation的注解配置不止这些,下面是一些Hibernate中常用的Annotation的具体方法
2.*
3.* @author liuguangyi
4.* @content ejb3注解的API定义在javax.persistence.*包里面。
5.*
6.* 注释说明:
7.* @Entity —— 将一个类声明为一个实体bean(即一个持久化POJO类)
8.*@Entity —— 将一个类声明为一个实体bean(即一个持久化POJO类)
8.* @Id —— 注解声明了该实体bean的标识属性(对应表中的主键)。
9.* @Table —— 注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字
10.* @Column —— 注解声明了属性到列的映射。该注解有如下的属性
11.* name 可选,列名(默认值是属性名)
12.* unique 可选,是否在该列上设置唯一约束(默认值false)
13.* nullable 可选,是否设置该列的值可以为空(默认值false)
14.* insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
15.* updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
16.* columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)
17.* table 可选,定义对应的表(默认为主表)
18.* length 可选,列长度(默认值255)
19.* precision 可选,列十进制精度(decimal precision)(默认值0)
20.* scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)
21.* @GeneratedValue —— 注解声明了主键的生成策略。该注解有如下属性
22.* strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO
23.*
24.* GenerationType.TABLE 使用一个特定的数据库表格来保存主键
25.* GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)
26.* GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。(这个值要与generator一起使用)
27.* generator 指定生成主键使用的生成器(可能是orcale中的序列)。
28.* @SequenceGenerator —— 注解声明了一个数据库序列。该注解有如下属性
29.* name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中
30.* sequenceName 表示生成策略用到的数据库序列名称。
31.* initialValue 表示主键初始值,默认为0.
32.* allocationSize 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.
33.* @GenericGenerator —— 注解声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性
34.* name 指定生成器名称
35.* strategy 指定具体生成器的类名(指定生成策略)。
36.* parameters 得到strategy指定的具体生成器所用到的参数。
37.*
38.*
39.*
40.*
41.*
42.*
43.*
44.*
45.*
46.*
47.*
48.*
49.*
50.*
51.*
52.*
53.*
54.*
55.*
56.*
57.*
58.*
59.*
60.*
61.*
62.*
63.*
64.*
65.*
66.*
67.*
68.*
69.*
70.*
71.*
72.*
73.*
74.* @OneToOne
75.* EmployeeInfo info;
76.*
77.*
78.*
79.*
80.*
81.*
82.*
83.*
84.*
85.*
86.*
87.* @OneToOne 设置一对一个关联。cascade属性有五个值(只有CascadeType.ALL好用?很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项)
88.*
89.*
90.*
91.*
92.*
93.*
94.*
95.*
96.*
97.*
98.*
99.*
100.*
101.* 方法三
102.*
103.*
104.*
105.*
106.*
107.*
108.*
109.* @ManyToOne 设置多对一关联
110.*
111.*
112.*
113.*
114.*
115.*
116.*
117.*
118.*
119.*
120.* @OneToMany 设置一对多关联。cascade属性指定关联级别,参考@OneToOne中的说明。fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载
121.*
122.*
123.*
124.*
125.*
126.*
127.*
128.*
129.*
130.*
131.*
132.*
133.*
134.*
135.*
136.*
137.*