spring jpa注解实现update操作,数据更新成功,但返回值为0

今日问题:

update成功但是返回值零,应该返回受影响条数,模拟如下

public int test(){
		Optional<User> userOpt = dao.findById(1);
		if(!userOpt.isPresent()) {
			return 0;
		}
		User user = userOpt.get();
		
		user.setAge(12);
		user.setName("qiao8jiag");
		
		return dao.userUpdate(user.getAge(), user.getName());
	}
public interface UserDao extends JpaRepository<User, Integer> {
	
	@Modifying
	@Transactional
	@Query("update User u set u.age = ?1, u.name = ?2 where u.id = '1'")
	int userUpdate(int age, String name);

}

打印日志发现,执行了两个update,第一个语句和repo.save()方法一样,第二个是我自己写的,所以在执行我的更新之前自动执行了一次update ,导致我自己sql没有对数据库进行更改。

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from user user0_ where user0_.id=?
Hibernate: update user set age=?, name=? where id=?
Hibernate: update user set age=?, name=? where id='1'
0

查询发现,hibernate有自动保存,如果对查询出来的结果直接进行set属性操作,在事务结束前,会自动对该实体进行一次保存。

解决方法:

  • 避免对查询结果直接进行操作:将查询出来的结果通过 BeanUtils.copyProperties方法复制一个对象出来,然后对副本对象进行set属性操作,不更改原对象。
public int test(){
		Optional<User> userOpt = dao.findById(1);
		if(!userOpt.isPresent()) {
			return 0;
		}
		User user = new User();
		BeanUtils.copyProperties(userOpt.get(), user);
		user.setAge(12);
		user.setName("dandan");
		
		return dao.userUpdate(user.getAge(), user.getName());
	}
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from user user0_ where user0_.id=?
Hibernate: update user set age=?, name=? where id='1'
1
  • 清除缓存(没有实践,待后补)

你可能感兴趣的:(java)