休止状態 (3.6.5) および EhCache (2.4.2)
VehicleAssembly は、状態遷移を持つ永続クラスです。オブジェクトはさまざまな段階を経て、最新のステータスで更新され、データストアに保存されます。
状態遷移例
現在、次のステップで VehicleAssembly が照会されると、'09/24/2013 11:00:30 PM' の時点での古いステータスが返されます。
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
結果を見ると、休止状態がキャッシュから VehicleAssembly の古いオブジェクトを返しているようです。VehicleAssembly クラスはキャッシュ可能ではないことに注意してください (クラス定義に @Cache アノテーションはありません)。また、これらの更新はすべて異なるセッションで行われており、データストアの分離レベルは 2 (コミットされた読み取り) です。
VehicleAssembly クラスは以下のとおりです。
@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>
このゴースト オブジェクトを突き止めるための指針は、非常に役立ちます。