jakarta.persistence.EntityManager操作数据库

通过注解注入:

其中primaryEntityManager需要配置,详见:Spring boot + Hibernate + MySQL实现用户管理示例-优快云博客 中的PrimaryDbConfig。

@PersistenceContext(unitName = "primaryEntityManager")
private EntityManager entityManager;

定义实体类:

@Entity
@Table(name = "users")
public class User implements Serializable {

根据Id查询实体:

User user = entityManager.find(User.class, id);

保存实体至数据库:其中user是实体User的实例。

entityManager.persist(user);

更新数据表:

entityManager.merge(user);

执行原生sql语句查询:

String sql = "select * from users where username = :username";	
Query query = entityManager.createNativeQuery(sql,User.class);
query.setParameter("username", "小王");
List<User> result = query.getResultList();

### JPA (Java Persistence API) 基础概念 JPA 是 Java EE 和 Jakarta EE 中的一部分,旨在简化数据库访问操作。通过使用 `javax.persistence.EntityManager` 和 `javax.persistence.Query` 接口,开发者可以方便地管理实体类及其生命周期,并执行各种类型的查询。 #### EntityManager 的基本功能 `EntityManager` 提供了一组方法来管理和控制持久化上下文中的实体实例。这些方法包括但不限于: - 创建新实体:`persist(Object entity)` - 更新现有实体:先调用 `merge(T entity)` 方法获取托管状态的对象再做修改 - 查找特定 ID 对应的实体:`find(Class<T> entityClass, Object primaryKey)` 对于批量数据检索而言,通常会借助于 JPQL 或 Criteria 查询构建器创建相应的 Query 实例来进行分页加载[^1]。 ```java // 获取 EntityManager 工厂并创建 EntityManager EntityManagerFactory factory = ...; EntityManager em = factory.createEntityManager(); try { // 开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); // 执行一些业务逻辑... } catch (Exception e) { throw new RuntimeException(e); } finally { if (em != null && em.isOpen()) { em.close(); } } ``` #### 处理异常情况 当遇到诸如违反唯一约束或其他数据库层面错误时,可能会触发 `RollbackException` 。为了更好地诊断此类问题,在捕获该异常的同时应该记录下详细的堆栈跟踪信息以及任何可能有助于后续分析的数据[^2]。 ```java try { // 尝试提交更改... tx.commit(); } catch (RollbackException ex) { logger.error("Transaction failed due to rollback", ex); // 进一步处理或重新抛出异常以便上层能够知晓失败状况 throw ex; } ``` #### 解决 TransactionRequiredException 错误 如果应用程序尝试在一个未启动的事物环境中执行需要事物的操作(比如更新/删除),则会发生 `TransactionRequiredException` 异常。为了避免这种情况的发生,应当确保每次涉及写入操作之前都已经正确开始了新的事物;另外也可以考虑调整传播行为属性以适应不同的场景需求[^5]。 例如,在 Spring 框架环境下可以通过配置 @Transactional 注解参数的方式指定合适的行为模式: | 属性名称 | 描述 | | --- | --- | | propagation | 定义如何参与现有的事物,默认值为 REQUIRED | ```java @Service public class MyService { private final EntityManager entityManager; public MyService(EntityManager entityManager) { this.entityManager = entityManager; } @Transactional(propagation = Propagation.REQUIRED) public void performOperation() { // 此处可安全地进行增删改查等操作而不用担心缺少事物环境的问题 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值