这次彻底搞懂 Hibernate 映射

it2022-05-09  25

(待更新) 参考自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)

转载于:https://www.cnblogs.com/hippiebaby/p/5465725.html

相关资源:数据结构—成绩单生成器

最新回复(0)