代码
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 持久化游离态的对象
*@param id
* @return
*/
@RequestMapping("/mergeDetached/{id}")
public String mergeDetached(@PathVariable("id")Long id){
try {
User user = userDao.findById(id);
userDao.mergeDetached(user);
}catch (Exception e){
logger.error("合并(merge)一个游离态的对象!",e);
return REPONSE_ERR;
}
return REPONSE_SUCCESS;
}
---------------------------------------------------------------
/**
* 合并游离态的对象
*
* @param user
*/
@Override
public void mergeDetached(User user) {
clear();
User newUser = merge(user);
newUser.setName("newUser merge detached success!");
user.setName("user merge detached success!");
}
步骤
:8080/user/list,获取`id`
:8080/user/mergeDetached/5,返回`SUCCESS!`
:8080/user/list,查看
结果:对应实体的name值变为newUser merge detached success!,证明返回新的对象为托管态对象
2.游离态
refresh方法可以保证当前的实例与数据库中的实例的内容一致,注意:是反向同步,将数据库中的数据同步到实体中
不同状态下执行em.refresh()方法产生结果:
瞬时态:抛异常org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed;
托管态: 将数据库中的数据同步到实体中,返回一个托管态的对象。
删除态:抛异常org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed;
游离态:抛异常org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed;
总结:只有被托管的对象才可以被refresh。
1.瞬时态
代码
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 刷新new出来的对象
*@param id
* @return
*/
@RequestMapping("/refreshNew")
public String refreshNew(){
try {
User user = new User().setName("lxt").setNumber("007");
userDao.refresh(user);
}catch (Exception e){
logger.error("刷新(refresh)一个new的对象!",e);
return REPONSE_ERR;
}
return REPONSE_SUCCESS;
}
步骤
:8080/user/refreshNew