0
    @RequestMapping("/testing") 
    @Transactional
    public String testing(HttpServletRequest request, final ModelMap model) 
    {               

        Criteria criteria = session.getCurrentSession().createCriteria(Student.class);      
        criteria.setReadOnly(true);

        criteria.add(Restrictions.eq("id", "ID12345"));

        List<Student> result =  criteria.list();                

        Student abc = result.get(0);

        abc.setFirstname("AAA");                

        Criteria criteria2 = session.getCurrentSession().createCriteria(Student.class);             
        criteria2.setReadOnly(false);


        criteria2.add(Restrictions.eq("id", "ID12345"));

        result =  criteria2.list();             

        Student abc2 = result.get(0);

        abc2.setFirstname("BBB");

        return "testing";
    }

上記のコードのように、setReadOnlyに対して true にする必要があるためcriteria、 (データベースでは) にfirstNameなりませんが、に対して を false にAAAリセットしました。なぜ(データベースで) にならなかったのですか?setReadOnlycriteria2firstnameBBB

4

1 に答える 1

1

わかりました、しばらく調査した後、私はその理由を見つけることができました。

最初のクエリがオブジェクトをロードしている間、hibernate はオブジェクトを永続的なコンテキストに置き、オブジェクトを としてマークしますread-only。つまり、オブジェクトは最終的にフラッシュされません。

オブジェクトをロードするための 2 回目の呼び出し中に、フェッチは主キーに基づいているため、hibernate はデータベースを再度呼び出すのではなく、永続的なコンテキストでオブジェクトをフェッチします。永続コンテキストからロードされるため、まだread-only状態のままです。

オブジェクトを再びフラッシュ可能setReadOnly(Object entity, boolean readOnly)に戻すには、 を使用しreadOnlyてオブジェクトの を元に戻すことができます。

于 2016-10-03T01:17:41.623 に答える