这次彻底搞懂 Hibernate 映射
(待更新)
参考自JPA 2.1 http://docs.jboss.org/hibernate/jpa/2.1/api/
类级标注
@Entity(name = "xxx") // 标注实体(可持久化对象)
// name (String) 实体名,默认是类名,这个名字用于查询时引用实体。
@Table(name = "xxx", schema = "xxx") // 标注实体对应的主表(是的还可以有二级表(们))
// name (String) 表名,默认是类名。
// schema (String) 表所属的模式名,默认是用户的默认模式名。
// catalog indexes uniqueConstraints 这仨属性不懂
## 属性标注
@Column(name = "xxx") // 标注列
// name (String) 列名,不写默认是字段名。
// unique (boolean) 是否唯一,默认是false。
// nullable (boolean) 是否可为空,默认是true。
// insertable (boolean) 是否可插入,不可插入就是不能写在insert语句里而是由数据库处理,默认是true。
// updatable (boolean) 是否可更改,不可更改就是不能写在update语句里而是由数据库处理,默认是true。
// columnDefinition table length precision scale 都不懂
## 主键标注
@Id // 标注主键,如果没有@Column标注,则字段名即为主键列名。
@GeneratedValue // 标注主键的生成策略
// strategy (GenerationType) 数据库生成主键的策略类型,默认是AUTO。
// AUTO 表示由数据库决定
// IDENTITY 表示数据库是标识列生成主键的(比如MySQL)
// SEQUENCE 表示数据库是用序列生成主键的(比如Oracle)
// TABLE 表示数据库是用表生成主键的
// generator (String) 由SequenceGenerator或TableGenerator标注的生成器名,默认是数据库提供的生成器。
@SequenceGenerator(name="xxx", sequenceName="xxx") // 标注序列生成器
// name (String) 生成器名,必须要有且唯一,用于引用生成器。
// sequenceName (String) 数据库中用来生成主键的序列名,默认是数据库中定义好的。
// catalog schema initialValue allocationSize 不懂
@TableGenerator(name="xxx", table="xxx") // 标注表生成器
// name (String) 生成器名,必须要有且唯一,用于引用生成器。
// table (String) 数据库中用来存放主键的表名,默认是数据库中定义好的。
// catalog ... 还有好多属性都不懂
## 关系标注
@OneToOne // 标注一对一关系(定义一种单向的与另一个实体关联的关系,不必在目标实体中标注,可以根据引用的对象类型推测出来;
// 如果这种关系是双向的,则必须在目标实体中用OneToOne的mappedBy属性声明(owing-side)实体的字段名)
// targetEntity (Class) 目标实体的类,默认是字段的类
// cascade (CascadeType[]) 级联类型组,默认是空
// ALL
// DETACH
// MERGE
// PERSIST
// REFRESH
// REMOVE
// fetch (FetchType) 抓取类型,默认是EAGER
// EAGER
// LAZY
// optional (boolean) 是否可选,默认是true。
// mappedBy (String) 拥有这个关系的实体的字段名。
// orphanRemoval 不懂
举例 →
// 1. 用外键关联的一对一关系
// Customer.java
@OneToOne(optional = false)
@JoinColumn(name = "CUSTREC_ID", unique = true, nullable = false, updatable = false)
public CustomerRecord getCustomerRecord() { return customerRecord; }
// CustomerRecord.java
@OneToOne(optional = false, mappedBy="customerRecord")
public Customer getCustomer() { return customer; }
// 2. 主键共享的一对一关系
// Employee.java
@Entity
public class Employee {
@Id
Integer id;
@OneToOne
@MapsId
EmployeeInfo info;
...
}
// EmployeeInfo.java
@Entity
public class EmloyeeInfo {
@Id
Integer id;
...
}
// 3. 用嵌入类关联的一对一关系(不懂,先略过)
举例结束
@OneToMany // 标注一对多关系(如果集合用范型声明了元素类型,则不需要在目标实体)
// 属性同OneToOne,除了没有optional,fetch的默认是LAZY。
举例 →
// 1. 使用了范型的一对多关系
// Customer.java
@OneToMany(cascade = ALL, mappedBy = "customer")
public Set<Order> getOrders() { return orders; }
// Order.java
@ManyToOne
@JoinColumn(name = "CUST_ID", nullable = false)
public Customer getCustomer() { return customer; }
// 2. 没有使用范型的一对多关系
// Customer.java
@OneToMany(targetEntity = com.duan.Order.class, cascade = ALL, mappedBy = "customer")
public Set getOrders() { return orders; }
// Order.java
@ManyToOne
@JoinColumn(name = "CUST_ID", nullable = false)
public Customer getCustomer() { return customer; }
// 3. 用外键关联的单向一对多关系
// Customer.java
@OneToMany(orphanRemoval = true)
@JoinColumn(name = "CUST_ID") // join column is in table for Order
public Set<Order> getOrders() { return orders; }
举例结束
@ManyToOne // 标注多对一关系(定义一种单向关系;如果是双向,则必须在一方的OneToMany中注明mappedBy属性)
// 属性同OneToOne,除了没有mappedBy和orphanRemoval。
举例 →
// 1.
@ManyToOne(optional = false)
@JoinColumn(name = "CUST_ID", nullable = false, updatable = false)
public Customer getCustomer() { return customer; }
// 2. 嵌入类,不懂,略过
举例结束
@ManyToMany // 标注多对多关系
@JoinColumn // 声明实体关系中用来连接的列
// name (String)