Java 为什么Hibernate返回不可缓存对象的过时数据?
Hibernate(3.6.5)和EhCache(2.4.2) VehicleAssembly是具有状态转换的persistence类。当对象经历不同阶段时,它将更新为最新状态并保存在数据存储中 状态转换示例 现在,在下一步中,当车辆总成查询如下时,将返回“09/24/2013 11:00:30 PM”的陈旧状态Java 为什么Hibernate返回不可缓存对象的过时数据?,java,hibernate,ehcache,Java,Hibernate,Ehcache,Hibernate(3.6.5)和EhCache(2.4.2) VehicleAssembly是具有状态转换的persistence类。当对象经历不同阶段时,它将更新为最新状态并保存在数据存储中 状态转换示例 现在,在下一步中,当车辆总成查询如下时,将返回“09/24/2013 11:00:30 PM”的陈旧状态 query = sessionFactory.getCurrentSession().createQuery("from VehicleAssembly va where va.as
query = sessionFactory.getCurrentSession().createQuery("from VehicleAssembly va where va.assemblyId = ? and assemblyType = ?");
query.setLong(0, Long.parseLong(refnum));
query.setString(1, assemblyType);
VehicleAssembly vaMaster = (VehicleAssembly) query.uniqueResult();
//refNum and assembltType are parameters to the method which has this code
从结果看,hibernate似乎正在从缓存返回一个过时的VehicleAssembly对象。请注意,VehicleAssembly类不可缓存(类定义中没有@Cache注释)。此外,所有这些更新都发生在不同的会话中,数据存储中的隔离级别为2(读取已提交)
车辆总成等级如下所示
@Entity
@Table(schema = "VEHICLES", name = "ASSEMBLY_MASTER")
@SequenceGenerator(name="idGenerator", sequenceName = "VEHICLES.ASSEMBLY_MASTER_ID_SEQ1", allocationSize=1)
public class VehicleAssembly implements java.io.Serializable {
private long id;
private long assemblyId;
private String assemblyType;
private String status;
private Date updateTs;
@Id
@Column(name = "ID", unique = true, nullable = false, precision = 16, scale = 0)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "iddGenerator")
public long getId() {
return id;
}
@Column(name = "ASSEMBLY_ID", nullable = false, precision = 16, scale = 0)
public long getAssemblyId() {
return assemblyId;
}
@Column(name = "ASSEMBLY_TYPE", nullable = false, length = 120)
public String getAssemblyType() {
return assemblyType;
}
@Column(name = "STATUS", nullable = false, length = 120)
public String getStatus() {
return status;
}
@Column(name = "UPDATED_TS", nullable = false, length = 7)
public Date getUpdateTs() {
return updateTs;
}
//Not addign setters for cosmetic reasons, actually implementation does have setters
}
在应用程序中启用了Hibernate二级缓存
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
org.hibernate.cache.EhCacheProvider
假的
真的
任何关于锁定这个幽灵物体的指针都会有很大帮助 您确定“VehicleSemblyv”上的更改已成功提交给数据库吗?您是否执行任何事务管理?例如,spring框架中的@Transactional。您需要设置一些隔离级别。在显示数据之前,还要确保您已经提交了数据并刷新了数据。@是的,更改已提交到数据库。状态转换的示例实际上来自数据库。@Khush是的,我们使用事务管理。隔离级别设置为2(读取已提交),数据已提交,如DB表所示。