亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Spring Data Repositories 之上使用 EntityManager

在 Spring Data Repositories 之上使用 EntityManager

墨色風雨 2021-06-15 12:35:44
最近,我遇到了以下代碼:@Transactionalpublic MyEntity insert(MyEntity entity) {    MyEntity merged = entityManager.merge(entity);    return myEntityRepository.save(merged);}其中實體管理器定義如下:@PersistenceContext private EntityManager entityManager;和存儲庫是 Spring QueryDSL 存儲庫:@Repositorypublic interface MyEntityRepository extends QueryDslRepository<MyEntity>{}我的問題是,entityManager.merge(entity)當我們使用myEntityRepositoryright after持久化實體時,是否真的需要調用?entityManager 是否正在執行存儲庫不能執行的操作?調用存儲庫還不夠嗎?
查看完整描述

2 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

對我來說,這看起來像是貨物崇拜編程。如果需要(有時是不需要的),的實現save()已經進行了合并:


/*

 * (non-Javadoc)

 * @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)

 */

@Transactional

public <S extends T> S save(S entity) {


    if (entityInformation.isNew(entity)) {

        em.persist(entity);

        return entity;

    } else {

        return em.merge(entity);

    }

}


查看完整回答
反對 回復 2021-06-17
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

對我來說,這看起來是一個非常危險的代碼,意圖有點模糊和一些過度設計:

  1. 您是否 100% 保證在您的層和存儲庫之間共享同一個事務管理器?如果沒有,你就有麻煩了。

  2. 你只是在做雙重工作(@Jens 回答表明了這一點)。

  3. @Transactional這里只會讓事情變得更糟(如果你有一些非標準的沖洗政策)。尤其要注意,如果您從同一個類中調用方法,它將無法工作,因為它通過代理工作。

  4. 如果你真的打算insert()(新記錄)你為什么需要merge()?

我的投票是 - 就像save()@Jens 指出的那樣使用。如果您確實需要insert()功能,那么您可能需要具有更新保護的真實事務,在這種情況下,我會在存儲庫層上執行一些自定義代碼。希望你不需要它。


查看完整回答
反對 回復 2021-06-17
  • 2 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號