JPA修改外键关联的实体类

情况一: 不update外键id, update外键关联的实体对象(不允许设置外键实体关联对象的id)

 

RestaurantDto restaurantDto = restaurantDao.getByUserId(userId);
restaurantDto.getLocation().setName(restaurant.getName());
restaurantDto.getLocation().setConnPerson(restaurant.getPrincipal());
restaurantDto.getLocation().setPointX(restaurant.getLocation().getPointX());
restaurantDto.getLocation().setPointY(restaurant.getLocation().getPointY());
restaurantDto.setName(restaurant.getName());
restaurantDto.setPrincipal(restaurant.getPrincipal());
restaurantDao.returnEntityManager().merge(restaurantDto);

 

情况二: update外键id, 需要实例化一个新的外键关联对象, 原有外键关联的对象绝不允许修改, 如果修改了必须把下面的注释干掉

 

RestaurantDto restaurantDto = restaurantDao.getByUserId(userId);  
LocationDto location = new LocationDto(restaurant.getLocation());  
location.setConnPerson(restaurantDto.getPrincipal());  
location.setConnPhone(userDto.getPhone());  
 //locationDao.returnentityManager().clear();  如果原外键关联的实体修改,必须使用clear后才能保存新new的实体
locationDao.returnentityManager().persist(location);
//location = locationDao.returnentityManager().merge(location); 如果使用merge替换persist, 必须对location重新赋值
restaurantDto.setLocation(location);  
restaurantDao.returnEntityManager().merge(restaurantDto); 

1. hql查询得到的数据封装到对象中,对象会放入一级缓存嘛(再次查询不会使用缓存,但是修改会保存到db)

2. 通过关联查询时(如A外键关联B), A和B都放入到一级缓存中, 只要A和B中的任一字段修改, 都会在事务提交时做update操作.

(1)jpa不允许一级缓存中的对象的主键id被修改

(2)级联保存时, 可以设置A和B的关联关系, 直接保存A即可. 而在对A的外键关联的B做实体级别的替换时(即先查出A,然后修改

A的外键), 必须先new 一个新的B实体, 并对B持久化(或者说将B实体由瞬态变为托管态)

3. persist()和merge的区别: https://blog.csdn.net/asdfsadfasdfsa/article/details/80042077

 

posted @ 2018-04-22 19:05  車輪の唄  阅读(13)  评论(0编辑  收藏  举报  来源