2

単純な選択クエリを実行するDAOメソッドがあります。

@Transactional
public List<Object[]> getMyTableData(Long someId)
{
    Session session = (Session) getEntityManager().getDelegate();

    return session
        .createSQLQuery("SELECT * FROM my_table where some_id = :someId")
        .addEntity(MyTable.class)
        .setParameter("someId", someId)
        .list();
}

それを実行すると、ログに2つのクエリが見つかります。

  1. 結果を正常に取得する「select*from MyTable where some_id=...」クエリ
  2. そしてそれの後、私は私のログでこれを見つけます:

    org.springframework.orm.jpa.JpaTransactionManager:トランザクションコミットの開始org.springframework.orm.jpa.JpaTransactionManager:EntityManagerでのJPAトランザクションのコミット[org.hibernate.ejb.EntityManagerImpl@162add4] org.hibernate.transaction.JDBCTransaction:commitorg。 hibernate.event.def.AbstractFlushingEventListener:フラッシュタイムカスケードの処理org.hibernate.event.def.AbstractFlushingEventListener:フラッシュ:0挿入、1更新、2オブジェクトへの0削除

次に、別のクエリ「Updatemy_tableset....」を起動します。

この更新クエリが実行されるのはなぜですか?

4

1 に答える 1

2

Paceが前述したように、「JPAでは、トランザクションがコミットされると、JPAは変更されたエンティティをデータベースに書き込みます」。そこで、注釈に追加readOnly = trueしてみたところ、問題が修正されました。@Transactional

于 2012-12-04T14:18:55.013 に答える