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

被折叠的 条评论
为什么被折叠?



