jpa hibernate - select语句提取旧数据

时间:2012-01-31 19:10:25

标签: java mysql hibernate jpa

我正在使用带有hibernate的jpa来检索具有MySql(InnoDB)数据库的数据对象。这是我的应用程序的工作流程。

  1. 用户查询结果
  2. 用户修改其中一个结果
  3. 数据库“取消激活”当前行并为新值运行插入
  4. 保存修改后,将刷新查询结果以显示更改。
  5. 例如:
    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查询缓存已开启...

0 个答案:

没有答案