📅  最后修改于: 2023-12-03 15:14:51.034000             🧑  作者: Mango
EJB 是一种企业级 Java 技术,旨在简化企业级应用程序的开发和部署。其中的实体 Bean 是 EJB 的一种模式,用于处理业务逻辑和数据持久化,与数据库建立映射关系。
实体 Bean 是一种 EJB 类型,它代表一个持久化的对象。可以将实体 Bean 看作是一个 Java 类,但它具有 EJB 的特殊功能。
实体 Bean 类需要满足以下要求:
java.io.Serializable
接口实体 Bean 属性要求是:
@Id
,该属性的类型必须为 java.lang.Long
,代表实体 Bean 的唯一标识符@Id
属性的值实体 Bean 的生命周期有以下 4 个阶段:
EntityManager
进行持久化和加载实体 Bean,即从数据库中获取数据。此时,实体 Bean 与 EntityManager
必须在同一个上下文环境中。EntityManager
的 detach()
方法将实体 Bean 从托管状态转化为脱管状态。此时,实体 Bean 不再与 EntityManager
相关连,但仍然具有 ID 值。EntityManager
的 remove()
方法删除实体 Bean 的记录,并使实体 Bean 进入 Removed 状态。可以使用以下方法进行实体 Bean 的 CRUD 操作:
persist(Object entity)
:将实体 Bean 持久化到数据库中,创建新的实体记录。merge(T entity)
:将实体 Bean 实体管理器的当前持久化上下文中的 “现有状态” 数据与实体 Bean 的状态信息合并,并返回新的合并后的实体。remove(Object entity)
:删除实体 Bean 数据记录。find(Class<T> entityClass, Object primaryKey)
:通过实体 Bean 类型和主键值获取持久化的实体 Bean,如果实体记录不存在,返回 null。实体关系是指实体 Bean 之间的关系。其一般分为单向关系和双向关系两种形式。实体关系采用注解进行定义。
一个实体 Bean 可以关联多个实体 Bean。实体 Bean 之间的关系可以通过 @OneToMany
和 @ManyToOne
注解进行定义。
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String orderNumber;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems;
}
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String itemNumber;
@ManyToOne
private Order order;
}
在上述代码中, Order
和 OrderItem
分别表示一个订单和订单项。Order
实体中使用了 @OneToMany
注解来表示其关联的实体类型是 OrderItem
,且通过 mappedBy
告诉 Hibernate/JPA 在 OrderItem
实体中通过哪个属性来表示订单。而 OrderItem
实体中使用了 @ManyToOne
注解来表示它属于某个订单,并通过 order
属性打通关联关系。
一个实体 Bean 可以被多个实体 Bean 关联。与上述一对多关系相反。
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String orderNumber;
}
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String itemNumber;
@ManyToOne
private Order order;
}
在上述代码中, Order
实体和 OrderItem
实体的关系与上述一对多关系代码一致,只是在 OrderItem
实体上使用了 @ManyToOne
注解,反映出其实体类属于某个订单。
一对一关系需要在两个实体 Bean 类中分别使用 @OneToOne
注解表示他们之间的关联。一般采用主键关联方式。
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@OneToOne(mappedBy = "employee")
private ParkingSpace parkingSpace;
}
@Entity
public class ParkingSpace {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String location;
@OneToOne
private Employee employee;
}
在上述代码中,Employee
实体和ParkingSpace
实体都会保持一对一关系。Employee
实体使用 @OneToOne
注解来告诉 Hibernate/JPA 要去哪里寻找和这个实体关联的另一实体。而 ParkingSpace
实体中使用 mappedBy
属性表示它的关联关系是通过 Employee 实体中的 parkingSpace
属性来确定的。
一对多的双向关系是通过在另一个实体中使用 @ManyToOne
注解来实现的。
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String orderNumber;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems;
}
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String itemNumber;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
}
在上述代码中, Order
实体和 OrderItem
实体关系依然采用了单向的一对多关系。Order
实体也声明了 @OneToMany
注解关系,但是在 OrderItem
实体中使用了双向关系来确保一个 Order
实体的所有 OrderItem
实体都是相互关联的。@ManyToOne
注解与之前的单向关系中相同,但对于所有实体 Bean 描述关系的实体 Bean,都需要添加一个 @JoinColumn
注解。该注解将在数据库表中为该关系增加一个外键。
多对一关系的双向关系也很容易实现,思路类似于上述一对多关系中的实体关系实现方式。
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String orderNumber;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems;
}
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String itemNumber;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
}
代码和上述多对一关系代码基本一致。
实体 Bean 是 EJB 中的一种模式,用于处理业务逻辑和数据持久化,与数据库建立映射关系。实体关系是指实体 Bean 之间的关系,一般分为单向关系和双向关系两种形式。实体关系采用注解进行定义。在实体关系中,单向关系使用 OneToMany
和 ManyToOne
标注,而双向关系使用两个级联注解来定义。