我有一个Entity
简化的,看起来像这样:
@Entity
@Table(name = "SOMETABLE")
public class SomeEntity {
// real code has id and more columns
@Column(name = "SOMECOLUMN")
private String someColumn;
@Transient
private SomeObject transientObject;
// getters and setters
}
@NamedQuery
DAO 方法通过使用 a和 JPA EntityManager
(大致存根)加载实体列表:
@Transactional
public List<SomeEntity> getSomeEntities() {
TypedQuery<SomeEntity> query = entityManager.createNamedQuery("findSomeEntities", SomeEntity.class);
List<SomeEntity> someEntities = query.getResultList();
for (SomeEntity someEntity : someEntities) {
someEntity.setTransientObject(<some value here>);
return someEntities;
}
}
请注意,此方法还设置transientObject
(在代码示例中进行了简化)。
下次getSomeEntities()
调用时,query.getResultList();
返回transientObject
仍然设置的对象列表。我希望瞬态对象为空,但事实并非如此。没有启用一级或二级缓存。
为了进一步混淆这一点,这只发生在单元测试期间,我们使用 HSQL 内存数据库。在 Tomcat 服务器上运行 Web 应用程序时,它工作正常。
我调试了一下,我发现在运行单元测试时,会话缓存(我理解它总是为 Hibernate 启用)似乎加载了所有以前加载的对象,但在应用程序服务器上运行时它是空的。我怀疑这意味着休眠从缓存而不是数据库中获取对象。
另外值得一提的是它是一个 Spring 应用程序。
这是什么原因?或者改写我的主要问题:为什么第二次使用 HSQLDB 加载实体时瞬态对象不为空?