簡體   English   中英

Spring + Hibernate:以多對多關系保存和獲取數據

[英]Spring + Hibernate: saving and fetching data in many-to-many relation

我正在使用Spring 3 + Hibernate,並且我有兩個相互關聯的實體(用戶,地址),它們之間的關系為@ManyToMany。 每個實體都映射到一個表(“用戶”和“地址”)上,並且該關系由映射表user_id和address_id的鏈接表“ user_address”定義。

我有添加新地址時保存“用戶”的“ method1”:

@Transactional
public void method1 (...) {
   /* do something*/
   user.getAddresses().add(address);
   session.save(user);
}

在另一種方法2中,我需要為特定用戶檢索街道旁的地址:

@Transactional
public Address method2 (Long userId, String streetName) {
   String hql = "select distinct a from Address a " +
            "join a.users u " +
            "where u.id=:id and a.name=:name";
            Query query = session.createQuery(hql);
            query.setParameterList("id", userId);
            query.setParameterList("name", streetName);
            Address address = query.uniqueResult();
            return address;
}

這種情況下的問題是,當通過method1添加新地址時,由於method2命中數據庫(執行時與緩存不同步),當執行method2(因此不返回地址)時,它仍可能位於高速緩存中。 我發現的唯一解決方案是在method1之后添加“ flush”,但我真的不喜歡它。 您知道更好的方法嗎?

至少對於我來說,在某些方法中手動調用session.flush()並不是一個壞主意。

還有其他選擇:

  • 將Hibernate FlushMode設置為AUTO或ALWAYS(首先嘗試AUTO,應防止查詢中出現過時的結果,ALWAYS太昂貴了才有用)
  • 在method1的Transactional注釋中將PROPAGATION級別設置為REQUIRES_NEW:將始終提交method1,暫停當前事務並創建一個新用戶以添加用戶。

暫無
暫無

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

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