EntityManager 的常用 API(find、merge)

写一个Demo:浏览器访问rest接口,修改数据库字段信息,用到以下方法 find() 方法,类似于 Hibernate 中的 Session 的 get() 方法,在执行 find 方法时就发送 SQL 语句 merge() 方法,类似于 Hibernate 中 Session 的 saveOrUpdate() 方法

1、先查看数据表

这里选择id为25的,进行修改。

2、MyService写rest接口

@Path("/MyService")
@RequestScoped
//@Transactional(value = TxType.REQUIRED)
public class MyService {
		
	@Inject
	EntityManager em;
	
	@GET
	@Path("/testFind")
	@Produces("text/html; charset=UTF-8")
	public String testFind() {
		Member member = em.find(Member.class, 25);
		
		System.out.println("member:"+member.getName());
		System.out.println("member:"+member.getEmail());
		System.out.println("member:"+member.getPhoneNumber());

		member.setName("xingqiwu");
		em.merge(member);
		
		System.out.println("member:"+member.getName());
		System.out.println("member:"+member.getEmail());
		System.out.println("member:"+member.getPhoneNumber());
		
		return "ok";
	}
}

3、浏览器地址输入直接访问rest接口:

会发现报错:

Transaction is required to perform this operation (either use a transaction or extended persistence context)

需要事务才能执行此操作(使用事务或扩展持久性上下文)

类上缺少 @Transactional(value = TxType.REQUIRED),特别注意添加。

@Transactional 解释:

解释很详细

在JPA实体状态中,该注解完成的是下面两步。

EntityManager 缓存中找到对应的对象,

调用merge方法,JPA会把传入的对象赋值到entityManager的缓存中的对象,然后对entityManager缓存中的对象执行update操作。

@Transactional 需要添加jar包,pom文件:

4、浏览器请求rest接口之后,查看结果

console:

数据表

经验分享 程序员 微信小程序 职场和发展