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 方法
}
posted @ 2019-05-05 20:56  Lomen~  阅读(570)  评论(0编辑  收藏  举报