我正在使用带有hibernate的jpa来检索具有MySql(InnoDB)数据库的数据对象。这是我的应用程序的工作流程。
例如:
1. Select * from example_table where example_type in(1,2,3,4,5) and status = "active"
2.在用户更新 - “Update example_table set status = "inactive" where example_table_id = 123
”上
3.插入example_table(...) values(.. user_new_value)
4.在刷新 - Select * from example_table where example_type in(1,2,3,4,5) and status = "active"
当刷新选择运行时,它返回结果。但是,仍然在刷新查询中返回设置为非活动的行,因为更新尚未完全提交。
由于我使用的是jpa和hibernate - 值得注意的是我使用的是明确编写的更新查询而不是entityManager.merge()
。我这样做是为了避免执行select语句后跟update语句。在我使用entityManager.merge执行更新之前 - 我的“旧数据”问题经常发生
我所追求的是一种强制我的选择查询等待所有行提交的方法。我使用过“SELECT...FROM..WHERE.. LOCK IN SHARE MODE
”,但没有运气。
有时结果会以正确的结果返回......有时他们却没有。我只需要一种方法来确保我的选择查询将“等待”所有更新...
编辑这里是我的JPA-HIBERNATE代码......
这是在更新之前和之后运行的select语句的jpa dao调用:
public List<Tracking_Prv_Reln> getFirstNetRelnsByTrackingIds_TrackingPrvReln(List<Long> trackingIdList){
Map<String, Object>namedParams = new Hashtable<String, Object>();
namedParams.put("TRACKING_ID_LIST", trackingIdList);
return getJpaTemplate().findByNamedQueryAndNamedParams("getFirstNetRelnsByTrackingIds_TrackingPrvReln", namedParams);
}
以下是在Entity中找到的namedQuery:
@NamedQuery(name="getFirstNetRelnsByTrackingIds_TrackingPrvReln",
query="SELECT tpr FROM Tracking_Prv_Reln tpr WHERE tpr.tracking_Id IN (:TRACKING_ID_LIST) " +
"AND tpr.unassign_Dt_Tm >= NOW() ",
hints=@QueryHint(name="org.hibernate.cacheable", value="false"))
这是接受传递的实体的更新语句(“Tracking_Prv_Reln”):
public void inactivateRow_TrackingPrvReln(Tracking_Prv_Reln tpr){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String query = "UPDATE Tracking_Prv_Reln SET unassign_Dt_Tm = STR_TO_DATE('" + sdf.format(tpr.getUnassign_Dt_Tm()) + "', '%Y-%m-%d %H:%i:%s'), " +
"updt_Dt_Tm = STR_TO_DATE('" + sdf.format(tpr.getUpdt_Dt_Tm()) + "', '%Y-%m-%d %H:%i:%s'), source_Flag = " + tpr.getSource_Flag() +
" WHERE tracking_Prv_Reln_Id = " + tpr.getTracking_Prv_Reln_Id();
executeQueryString(query);
}
public void executeQueryString(final String string){
getJpaTemplate().execute(new JpaCallback(){
public Object doInJpa(EntityManager em)throws PersistenceException {
String queryString = string;
Query query = em.createQuery(queryString);
return query.executeUpdate();
}
});
}
我的hibernate查询缓存已开启...