spring-data-jpa更新实体

今天写j2ee大作业的时候写到用户修改信息,需要对用户提交的域进行更新操作,因为还是spring-data-jpa菜鸟,踩了不少坑。。。先把现在有的记录一个
刚开始是想要找一个可以更新整个实体的方法,找到如下方法
在service层的代码中

Customer cust = CustomerDAO.findByUserid(id);//根据id找到要进行修改的实体 cust.set....//这里可以调用cust里的各种方法,把界面上更改的cust属性一个个set进去

ok!改完运行!
运行结束回去看数据库表,发现除了这里set的域之外的所有其他域都变成了null,这个显然不是我想要的结果,之后去查看spring-data-jpa的官方文档
发现可以使用@Query注解进行更新,其中的例子为:

@Modifying @Query("update User u set u.firstname = ?1 where u.lastname = ?2") int setFixedFirstnameFor(String firstname, String lastname);

既然这样的话,在dao层还是不要一整个实体更新了吧,感觉会造成hin大的压力,也使用这种方法对实体的每个域写一个更新的方法,在service层可以只更新修改的域,也为之后修改会员等级留个方便的接口
修改dao层接口

@Modifying @Query("update Customer as c set c.name = ?1 where c.userid=?2") int updateNameById(String name, int id);

其他各域原理同上
ok!再次运行!

结果又报错!!

...     nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query;  nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query ...

说是Transaction的问题,google一下,说要在dao层的update方法上添加@Transaction进行事务管理
那就加上!
这次应该没问题了吧。。。再次运行,结果。。。

终于成功啦!~

好了,这次spring-data-jpa更新实体的记录就到这里,只是记录备忘,如果有错的话欢迎指出!
参考:http://stackoverflow.com/questions/10220262/updating-boolean-value-in-spring-data-jpa-using-query-with-hibernate

相关内容推荐