深入理解JPA:EntityManager与事务控制

4星 · 超过85%的资源 需积分: 3 6 下载量 74 浏览量 更新于2024-10-07 收藏 176KB DOC 举报
【关于JPA基本概念的讲述】 Java Persistence API (JPA) 是Java平台上的一个标准,用于管理和持久化Java对象到关系数据库。它提供了一种面向对象的方式来操作数据,简化了对象关系映射(ORM)的过程。 1. **EntityManager**: EntityManager 是 JPA 的核心组件,它是与数据库交互的主要接口。它负责管理实体对象(Entities),执行CRUD(创建、读取、更新、删除)操作,并处理对象与数据库之间的映射。EntityManagerFactory 是 EntityManager 的工厂类,用于创建 EntityManager 实例,它存储了持久化单元(Persistence Unit)的元数据信息,这些信息定义了与数据库的连接配置以及映射信息。 2. **持久化上下文(Persistence Context)**: 持久化上下文是 EntityManager 的一部分,它保存了实体对象的状态,并与当前事务关联。分为两种类型: - **Container-Managed Persistence Context**:由容器(如EJB容器)管理,通常与JTA事务一起使用,提供跨多个数据库的事务支持。 - **Application-Managed Persistence Context**:由应用程序代码直接管理,不涉及容器事务管理。 3. **实体对象的生命周期**: JPA 定义了实体对象的几个生命周期状态:新建(New)、持久化(Managed)、游离(Detached)和删除(Removed)。EntityManager 提供了相应的操作来转换这些状态,例如 `persist()`、`merge()`、`remove()` 和 `detach()`。 4. **EntityManager的接口方法**: - `persist()`: 使实体对象成为持久化状态,如果对象已经是持久化状态则不做任何操作。 - `merge()`: 合并实体到当前持久化上下文,如果对象已持久化,会更新其状态。 - `remove()`: 删除指定的实体对象。 - `refresh()`: 从数据库中重新加载实体的最新状态。 - `flush()`: 将持久化上下文中的更改同步到数据库。 5. **实体对象的监听器和回调方法**: JPA 允许定义实体监听器,可以监听特定的生命周期事件,如 `@PrePersist`、`@PostPersist`、`@PreUpdate`、`@PostUpdate`、`@PreRemove` 和 `@PostRemove`。 6. **拦截器**: 拦截器允许在方法调用前后执行自定义逻辑,例如在 Session Bean 方法调用前验证用户权限。 7. **EJB3 继承关系的映射**: EJB3 支持多态性,可以通过 JPA 注解(如 `@Inheritance` 和 `@InheritanceType`)来定义实体类的继承关系及其在数据库中的映射策略。 8. **注入EntityManager对象**: 使用 `@PersistenceContext` 注解可以在类中注入 EntityManager,以便进行数据库操作。 9. **获取实体类信息**: 通过分析持久化单元配置或使用工具,可以知道哪些实体类会被映射到数据库表。 10. **应用程序管理EntityManager**: 可以通过 `EntityManagerFactory.createEntityManager()` 来手动创建和管理 EntityManager 实例。 11. **JTA事务控制**: Java Transaction API (JTA) 允许跨越多个数据源的事务管理。JPA 结合 JTA 可以实现复杂的分布式事务。 12. **事务的回滚和传播特性**: 在声明式事务管理中,可以使用 `@TransactionAttribute` 注解定义事务的回滚规则。事务的传播特性(如 REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER 和 NESTED)决定了方法调用时事务如何处理。 13. **监听实体对象的调用**: 可以通过实现 javax.persistence.EntityListener 接口并注册到实体类来监听实体对象的方法调用。 14. **拦截Session Bean的方法调用**: 使用 EJB 3.1 的拦截器机制(@Interceptor 和 @AroundInvoke 等注解)可以拦截 Session Bean 的方法,添加额外的业务逻辑。 JPA 提供了一套完整的框架,使得开发者可以更加专注于业务逻辑,而不用关心底层数据库的细节。通过理解和熟练掌握这些概念,开发者能够有效地利用 JPA 进行高效且灵活的数据持久化操作。