我正在开发一个 RESTful 网络服务弹簧数据作为其数据访问层,由 JPA/Hibernate 支持。
领域实体之间存在关系是很常见的。例如,想象一个实体Product
which has a Category
entity.
现在,当客户POST
s a Product
JAX-RS 方法的表示。该方法注释为@Transactional
将每个存储库操作包装在事务中。当然,客户端只发送id
一个已经存在的Category
,不是整个表示,只是一个引用(外键)。
在该方法中,如果我这样做:
entity = repository.save(entity);
变量entity
现在有一个Category
仅与id
字段集。这并不令我惊讶。我没想到会通过保存(SQL 插入)来检索相关对象的信息。但我需要整个Product
对象和相关实体能够返回给用户。
然后我这样做了:
entity = repository.save(entity);
entity = repository.findOne(entity.getId());
也就是说,在持久化对象后检索该对象,在同一事务/会话内.
令我惊讶的是,变量entity
没有改变任何东西。实际上,数据库甚至没有得到一个选择查询。
这和Hibernate的缓存有关。由于某种原因,在同一事务中,如果该对象之前已被持久化,则查找不会检索整个对象图。
对于 Hibernate,解决方案似乎是使用session.refresh(entity)
(see this and this)。说得通。
但是我如何用 Spring Data 来实现这一点呢?
我想避免创建重复的自定义存储库。我认为这个功能应该是 spring data 本身的一部分(有些人已经在 spring data 的论坛中报告了这一点:thread1, thread2).