O/R Mapping 对象关系映射
什么是O/R Mapping?
ORM(Object-Relational Mapping)是一种将对象模型和关系型数据库之间的映射关系进行自动化转换的技术。ORM 的目标是将对象模型和关系型数据库之间的转换过程自动化,使开发人员可以使用面向对象的方式来操作数据库,从而提高开发效率和代码质量。
ORM 框架通常提供了以下功能:
- 对象和关系之间的映射关系定义。
- 数据库操作的自动化,包括 CRUD 操作、事务管理等。
- 对象关系查询语言(Object-Relational Query Language,简称 ORQL)和对象关系映射查询语言(Object-Relational Mapping Query Language,简称 ORMQL)的支持。
- 缓存管理和性能优化。
JPA (Java Persistence API)
是 Java EE 5 规范中的一部分,它提供了一种标准的方式来管理 Java O/R Mapping。
JPA 的核心是实体(Entity)和持久化上下文(Persistence Context)。实体是指映射到数据库表的 Java 对象,持久化上下文是指管理实体的对象。JPA 提供了一组注解和 API,用于将实体映射到数据库表,以及对实体进行 CRUD(Create、Retrieve、Update、Delete)操作。
实例1: 创建实体
Coffee.class
@Entity // // @Entity 注解标识 User 类是一个 JPA 实体类
@Table(name = "T_MENU") // // @Table 注解指定了映射到的数据库表名
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Coffee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // @GeneratedValue 注解指定了主键的生成策略
private Long id;
private String name;
@Column // @Column 注解指定了实体属性与数据库表列之间的映射关系
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmount",
parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
private Money price;
@Column(updatable = false) // 不可更新
@CreationTimestamp
private Date createTime;
@UpdateTimestamp
private Date updateTime;
}
CoffeeOrder.java
@Entity
@Table(name = "T_ORDER")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CoffeeOrder implements Serializable {
@Id
@GeneratedValue
private Long id;
private String customer;
@ManyToMany // T_ORDER表和T_ORDER_COFFEE表中的items的多对多关系
@JoinTable(name = "T_ORDER_COFFEE")
private List<Coffee> items;
@Column(nullable = false)
private Integer state;
@Column(updatable = false)
@CreationTimestamp
private Date createTime;
@UpdateTimestamp
private Date updateTime;
}
实例2: 使用@MappedSuperclass
@MappedSuperclass
用来说明当前实体为父类实体,其中的成员可被子类继承。
父类 BaseEntity.class
@MappedSuperclass
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(updatable = false)
@CreationTimestamp
private Date createTime;
@UpdateTimestamp
private Date updateTime;
}
子类会拥有所有父类的字段成员。
子类Coffee.class
@Entity
@Table(name = "T_MENU")
@Builder
@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class Coffee extends BaseEntity implements Serializable {
private String name;
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmount",
parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
private Money price;
}
子类CoffeeOrder.class
@Entity
@Table(name = "T_ORDER")
@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CoffeeOrder extends BaseEntity implements Serializable {
private String customer;
@ManyToMany
@JoinTable(name = "T_ORDER_COFFEE")
@OrderBy("id")
private List<Coffee> items;
@Enumerated
@Column(nullable = false)
private OrderState state;
}
枚举类OrderState.class
public enum OrderState {
INIT, PAID, BREWING, BREWED, TAKEN, CANCELLED
}