SpringBoot项目中使用set方法后,自动保存问题

在SpringBoot项目中,使用JPA更新关联表数据时,因对象状态管理不当导致数据意外更新的问题及解决方法。涉及托管状态、持久化状态、游离状态等概念,以及通过创建新对象或使用Hibernate EntityManager的evict方法避免自动保存。

问题:
在springboot项目中,例如:meal表存放套餐,里面有id和name两个字段,数据有id:1 name:A套餐
id:2 name:B套餐。person表中存放人,里面有两个字段,name和mealid,数据有name:张三 mealid:1
name:李四 mealid:1
然后dao层取得person表中所有数据,但mealid字段为1,而不是A套餐,我在service层,在查找出meal表中数据,一一对比,将A套餐set进person表中mealid字段中,然后传到前台,就会是张三 A套餐,李四 A套餐

但在set后,jpa在没有调用update方法情况下自动保存了,这时候就有问题,person 表中数据就是 name:张三 mealid:A套餐 name:李四 mealid:A套餐。数据就变了

原因:
我只了解到jpa对象存在几个状态,
瞬时状态:
托管状态:
持久化状态:
游离状态:
销毁对象:
要将jpa对象变成游离状态,就不会保存了

解决方案:
1、创建新的对象,然后将值循环set进去,然后对新对象进行改变,就不会自动保存
以下代码:
content是jpa获取到的,我创建了一个listTo集合,然后在循环中每次创建对象,将数据放在新的对象中,然后在set赋值,就不会自动保存,同时业务也完成了。
我使用的是这个方案,但如果数据多,肯定有问题。

		List<com.sxrb.entity.meal> content = findAll.getContent();
		List<com.sxrb.entity.meal> listTo = new ArrayList<com.sxrb.entity.meal>();
		for(int i=0;i<content.size();i++) {
			meal mealTo=new meal();
			mealTo.setMealName(content.get(i).getMealName());
			mealTo.setMealDownloads(content.get(i).getMealDownloads());
			mealTo.setMealPrice(content.get(i).getMealPrice());
			mealTo.setMealDatestart(dateStamp.stampToDate(content.get(i).getMealDatestart()));
			mealTo.setMealDateend(dateStamp.stampToDate(content.get(i).getMealDateend()));
			mealTo.setMealTime(content.get(i).getMealTime());
			mealTo.setId(content.get(i).getId());
			mealTo.setMealDetail(content.get(i).getMealDetail());

			listTo.add(mealTo);
		}
		return listTo;
	}

2、使用HibernateEntityManager,调用获得Session,然后在set完之后用Session的.evict()方法清掉该对象缓存,但这个方案,我使用后,发现对象清除了,后续用到时候没有,会报错,说状态消失之类的。
可以看以下的博客,或者搜索这类的信息。毕竟有方向了。
我也是看到下面的博客了解的。

https://blog.csdn.net/weixin_34363171/article/details/93644672
https://blog.csdn.net/qqfo24/article/details/83275610

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值