gpt4 book ai didi

java - Spring/Hibernate - 实体被隐式持久化

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:53 24 4
gpt4 key购买 nike

在以下代码中,CustomerService.test() 方法隐式保留客户对象,即不调用任何 merge() 或 update()。为什么会这样,我如何才能强制它仅在我明确调用合并/更新时保留实体?

Controller :

@Controller
@RequestMapping("/samples")
public class Samples {
@Autowired
private CustomerService customerService;


@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public String test(){
customerService.test();
return "ok";
}
}

服务:

@Service
@Transactional
public class CustomerService {

@Autowired
private BaseDao baseDao;

public Customer findById(Long id) {
return baseDao.find(Customer.class,id);
}

public void test() {
Customer customer = findById(1L);
customer.setEmail("a@b.com");
}
}

道:

@Repository("baseDao")
public class BaseDao {
@PersistenceContext
private EntityManager em;

public void create(BaseEntity entity) {
em.persist(entity);
}

public <T> List<T> list(Class<T> entityClass) {
Session session = (Session) em.getDelegate();
List<T> list = session.createCriteria(entityClass).list();
return list;
}

public <T> T find(Class<T> entityClass, long primaryKey) {
return em.find(entityClass, primaryKey);
}

public <T> T update(T entity) {
return em.merge(entity);
}

public void remove(BaseEntity entity) {
em.remove(entity);

}

public void remove(Class<? extends BaseEntity> entityClass, long primaryKey) {
BaseEntity entity = em.find(entityClass, primaryKey);
if (entity != null) {
em.remove(entity);
}
}
}

最佳答案

您需要注意 test 方法在 Hibernate 事务中。因此,您需要了解您的实体生命周期。

Hibernate Life cycle

加载实体后,其状态为持久。当您提交事务时,Hibernate 检查事务中的所有持久实体:如果它们是脏的(有更改),它们将被更新。

查看该图表,您可以 evict() 您的实体或在交易后更改其电子邮件。

关于java - Spring/Hibernate - 实体被隐式持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31676176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com