【发布时间】:2013-01-12 22:42:17
【问题描述】:
我正在开发一个以spring-data 作为其数据访问层的 RESTful Web 服务,由 JPA/Hibernate 提供支持。
域实体之间存在关系是很常见的。例如,想象一个实体Product,有一个Category实体。
现在,当客户端 POSTs 将 Product 表示为 JAX-RS 方法时。该方法使用@Transactional 进行注释,以将每个存储库操作包装在事务中。当然,客户端只发送已经存在的Category 的id,而不是整个表示,只是一个引用(外键)。
在那个方法中,如果我这样做:
entity = repository.save(entity);
变量entity 现在有一个Category,只有id 字段集。这并不让我感到惊讶。我没想到会保存(SQL 插入)来检索相关对象的信息。但我需要整个Product 对象和相关实体才能返回给用户。
然后我这样做了:
entity = repository.save(entity);
entity = repository.findOne(entity.getId());
也就是说,在持久化对象后检索对象,在同一事务/会话中。
令我惊讶的是,变量entity 并没有改变任何东西。实际上,数据库甚至没有得到一个选择查询。
这与 Hibernate 的缓存有关。出于某种原因,在同一个事务中,如果该对象先前已持久化,则查找不会检索整个对象图。
对于 Hibernate,解决方案似乎是使用session.refresh(entity)(请参阅this 和this)。有道理。
但是如何使用 spring 数据实现这一点?
我想避免创建重复的自定义存储库。我认为这个功能应该是 spring data 的一部分(有些人已经在 spring data 的论坛中报告了这个:thread1,thread2)。
【问题讨论】:
标签: java rest jpa spring-data-jpa hypermedia