📜  EJB-实体关系(1)

📅  最后修改于: 2023-12-03 15:14:51.034000             🧑  作者: Mango

EJB实体关系

EJB 是一种企业级 Java 技术,旨在简化企业级应用程序的开发和部署。其中的实体 Bean 是 EJB 的一种模式,用于处理业务逻辑和数据持久化,与数据库建立映射关系。

实体 Bean
定义

实体 Bean 是一种 EJB 类型,它代表一个持久化的对象。可以将实体 Bean 看作是一个 Java 类,但它具有 EJB 的特殊功能。

实体 Bean 类

实体 Bean 类需要满足以下要求:

  • 必须是公共的 Java 类
  • 必须有一个公共的无参构造函数
  • 必须实现 java.io.Serializable 接口

实体 Bean 属性

实体 Bean 属性要求是:

  • 需要有一个或多个属性
  • 属性必须具有 getter 和 setter 方法
  • 必须存在一个属性被注解为 @Id,该属性的类型必须为 java.lang.Long,代表实体 Bean 的唯一标识符
  • 实体 Bean 不可修改 @Id 属性的值
生命周期

实体 Bean 的生命周期有以下 4 个阶段:

  • 创建(New):通过调用实体 Bean 的构造函数生成实例,并为新实体分配唯一的 ID。
  • 托管(Managed):通过 EntityManager 进行持久化和加载实体 Bean,即从数据库中获取数据。此时,实体 Bean 与 EntityManager 必须在同一个上下文环境中。
  • 脱管(Detached):通过 EntityManagerdetach() 方法将实体 Bean 从托管状态转化为脱管状态。此时,实体 Bean 不再与 EntityManager 相关连,但仍然具有 ID 值。
  • 删除(Removed):通过 EntityManagerremove() 方法删除实体 Bean 的记录,并使实体 Bean 进入 Removed 状态。
实体 Bean 的 CRUD

可以使用以下方法进行实体 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;
}

在上述代码中, OrderOrderItem 分别表示一个订单和订单项。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 之间的关系,一般分为单向关系和双向关系两种形式。实体关系采用注解进行定义。在实体关系中,单向关系使用 OneToManyManyToOne 标注,而双向关系使用两个级联注解来定义。