繁体   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