加载实体第二遍的时候我有一个Entity
的是,简化,看起来是这样的:瞬态场不空使用HSQLDB
@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
}
一个DAO方法,通过使用@NamedQuery
和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启用)似乎在运行单元测试时,装载所有以前加载的对象,但在运行时,它是空的应用程序服务器。我怀疑这意味着hibernate会从缓存而不是数据库中获取对象。
另外值得一提的是它是一个Spring应用程序。
这是什么原因?或更改我的主要问题:当使用HSQLDB第二次加载实体时,为什么transient对象不为null?
所以在你调用'someEntity.setTransientObject()之前,'',someEntity.transientObject!= null'? –
2013-03-19 19:55:07
我第一次打电话给方法,是的。第二次,它是**不**空。是的,它是**之前**我再次设置它。试图澄清这个问题。 – Magnilex 2013-03-19 19:57:21