Spring + Hibernate:以多对多关系保存和获取数据

时间:2012-02-14 20:23:50

标签: hibernate spring caching save

我正在使用Spring 3 + Hibernate,我有两个与@ManyToMany关系相互关联的实体(User,Address)。每个实体都映射在一个表('user'和'address')上,并且该关系由映射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”,但我真的不喜欢它。你知道更好的方法吗?

1 个答案:

答案 0 :(得分:0)

在某些方法中手动调用session.flush()并不是一个坏主意,至少对我而言。

还有其他选择:

  • 将Hibernate FlushMode设置为AUTO或ALWAYS(首先尝试AUTO,应该 防止过时的查询结果,总是很昂贵而且很有用)
  • 在方法1的事务性注释中将PROPAGATION级别设置为REQUIRES_NEW:将始终提交方法1,暂停当前的trasaction并创建一个新的用于添加用户。
相关问题