簡體   English   中英

Spring / Hibernate - 隱式持久化實體

[英]Spring/Hibernate - entities being implicitly persisted

在以下代碼中,CustomerService.test()方法隱式保留客戶對象,即不調用merge()或update()。 為什么會出現這種情況?如果我明確調用merge / update,我怎么強制它才能持久保存實體?

控制器:

@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生命周期

加載實體后,其狀態為Persistent 當您提交事務時,Hibernate會檢查事務中的所有持久實體:如果它們是臟的 (有更改),則會更新它們。

查看該圖表,您可以在交易 evict()您的實體或更改其電子郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM