Hibernate 注解
步骤
1. 新建 pojo 并增加注解
2. 注解写完后,需要在 hibernate.cfg.xml 核心配置中增加:
<mapping class="pojo类的路径" />
类级别注解
注解 | 说明 |
---|---|
@Entity | 映射实体类 |
@Table | 映射数句库表 |
@Entity(name="tableName")
- 必须,注解将一个类声明为一个实体bean。
- 属性:
name- 可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略。
@Table(name="", catalog="", schema="")
-
可选,通常和@Entity 配合使用,只能标注在实体的 class 定义处,表示实体对应的数据库表的信息。
-
属性:
name- 可选,表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
catalog
- 可选,表示Catalog名称,默认为Catalog("").
schema
- 可选 , 表示 Schema 名称 , 默认为Schema("").
属性级别注解
注解 | 说明 |
---|---|
@Id | 映射生成主键 |
@Version | 定义乐观锁 |
@Column | 映射表的列 |
@Transient | 定义暂态属性 |
1. 与主键相关注解
@Id
- 必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键,置于 getXxxx() 前。
@GeneratedValue(strategy=GenerationType, generator="")
-
可选,用于定义主键生成策略。
-
属性:
Strategy
- 表示主键生成策略,取值有:
取值 | 说明 |
---|---|
GenerationType.AUTO | 根据底层数据库自动选择(默认),若数据库支持自动增长类型,则为自动增长。 |
GenerationType.INDENTITY | 根据数据库的Identity字段生成,支持DB2、MySQL、 MS、SQLServer、SyBase与HyperanoicSQL数据库的Identity 类型主键。 |
GenerationType.SEQUENCE | 使用Sequence来决定主键的取值,适合Oracle、DB2等支持Sequence的数据库,一般结合@SequenceGenerator使用。(Oracle没有自动增长类型,只能用Sequence) |
GenerationType.TABLE | 使用指定表来决定主键取值,结合@TableGenerator使用。 |
2. 与非主键相关注解
@Version
- 可以在实体bean中使用@Version注解,通过这种方式可添加对乐观锁定的支持。
@Basic
-
用于声明属性的存取策略
@Basic(fetch=FetchType.EAGER) 即时获取(默认的存取策略)
@Basic(fetch=FetchType.LAZY) 延迟获取
@Temporal
-
用于定义映射到数据库的时间精度:
@Temporal(TemporalType=DATE) 日期
@Temporal(TemporalType=TIME) 时间
@Temporal(TemporalType=TIMESTAMP) 两者兼具
@Column
-
可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具非常有作用。
-
属性:
name
- 可选,表示数据库表中该字段的名称,默认情形属性名称一致
nullable
- 可选,表示该字段是否允许为null,默认为 true
unique
- 可选,表示该字段是否是唯一标识,默认为 false
length
- 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.
insertable
- 可选,表示在ORM框架执行插入操作时,该字段是否应出现 INSETRT 语句中,默认为true
updateable
- 可选,表示在ORM框架执行更新操作时,该字段是否应该出现在 UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。
columnDefinition
- 可选,表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP。 此外 ,String的默认映射类型为VARCHAR,如果要将String 类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用。
@Transient
- 可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为 @Basic
映射实体bean的关联关系
一、关联映射的一些共有属性
@OneToOne、@OneToMany、@ManyToOne、@ManyToMany的共有属性:
1. fetch 配置加载方式
取值 | 说明 |
---|---|
Fetch.EAGER | 及时加载,多对一默认是Fetch.EAGER |
Fetch.LAZY | 延迟加载,一对多默认是Fetch.LAZY |
2. cascade 设置级联方式
取值 | 说明 |
---|---|
CascadeType.PERSIST | 保存 |
CascadeType.REMOVE | 删除 |
CascadeType.MERGE | 修改 |
CascadeType.REFRESH | 刷新 |
CascadeType.ALL | 全部 |
3. targetEntity 配置集合属性类型
如:@OneToMany(targetEntity=Book.class)
@JoinColumn
- 可选,用于描述一个关联的字段。
- 属性:
name- 该字段的名称,由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定。
一对一
@Entity
public class Company {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Address address;
// 省略了 get 和 set 方法
}
@Entity
public class Address {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String city;
@OneToOne(cascade=CascadeType.ALL,mappedBy="address")
// mappedBy="address" 映射关系交给了对方(Company)维护,相当于 inverse="true" 放权
private Company company;
// 省略了 get 和 set 方法
}
一对多 / 多对一
@Entity
public class Employee {
// 员工 多方
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int empid;
private String ename;
@ManyToOne(cascade=CascadeType.ALL)
private Department department;
// 省略了 get 和 set 方法
}
@Entity
public class Department {
// 部门 一方
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int deptid;
private String dname;
@OneToMany(mappedBy="department")
// mappedBy="department" 映射关系交给了对方(Employee)维护,相当于 inverse="true" 放权
private Set<Employee> employees = new HashSet<Employee>();
// 省略了 get 和 set 方法
}
多对多
@Entity
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
@ManyToMany(cascade=CascadeType.ALL)
private Set<Course> courses = new HashSet<Course>();
// 省略了 get 和 set 方法
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
@ManyToMany(mappedBy="courses")
// mappedBy="courses" 映射关系交给了对方维护,相当于 inverse="true" 放权
// 一般为被选择的一方放权
private Set<Student> students = new HashSet<Student>();
// 省略了 get 和 set 方法
}