写一个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接口:http://localhost:8081/jboss-javaee-webapp/rest/MyService/testFind
会发现报错:
Transaction is required to perform this operation (either use a transaction or extended persistence context)
需要事务才能执行此操作(使用事务或扩展持久性上下文)
类上缺少 @Transactional(value = TxType.REQUIRED),特别注意添加。
@Transactional 解释:
https://blog.youkuaiyun.com/u013361361/article/details/19157249
https://blog.youkuaiyun.com/xiang__liu/article/details/80805967 解释很详细
在JPA实体状态中,该注解完成的是下面两步。
EntityManager 缓存中找到对应的对象,
调用merge方法,JPA会把传入的对象赋值到entityManager的缓存中的对象,然后对entityManager缓存中的对象执行update操作。
@Transactional 需要添加jar包,pom文件:
4、浏览器请求rest接口之后,查看结果
console:
数据表