5

DBに書き込む方法は3つあります

public void create(T object) {
    entityManager.persist(object);
}

public void update(T object) {
    object = entityManager.merge(object);
}

public int updateStatus(String id, String status) {

    final int changes =
                entityManager.createQuery("update item set state = :newState," +
                        " last_modified = current_timestamp" +
                        " where id = : id ")
                    .setParameter("newState", status)
                    .setParameter("id", id)
                    .executeUpdate();

            return changes;
}

私が抱えている問題は、HibernateEnversが実際に監査レコードを対応するx_audおよびrevinfoDBテーブルに書き込むようにすることです。'.persist()'または'.merge()'に対してのみ正常に機能します。'createQuery(...). executeUpdate() 'で動作させることができません

私は何かが足りないのですか、それともこれではうまくいきませんか?問題は、私のコードの多くが.executeUpdateを使用して記述されており、マージされていないことです。したがって、既存のコードで機能するには、これが本当に必要です。

誰か助けてもらえますか?

4

3 に答える 3

8

いいえ、executeUpdateを使用している場合、Enversは機能しません。これは、更新がHibernateのイベントメカニズムを通過しないため、Enversが変更をインターセプトして監査を書き込む可能性がないためです。

于 2013-01-07T10:42:50.703 に答える
3

これを試して -

    public int updateStatus(String id, String status) {

    final int changes =
                entityManager.createQuery("Update Item set state = :newState," +
                        " lastModified = CURRENT_TIMESTAMP" +
                        " where id = : id ")
                    .setParameter("newState", status)
                    .setParameter("id", id)
                    .executeUpdate();

            return changes;
}

次のリンクは、JPQLについてさらに学ぶのに役立ちます-

http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html

于 2013-01-04T03:50:49.867 に答える
2

Avinash T.が正しいようです。ネイティブSQLクエリを作成する場合は、のメソッドを使用しcreateNativeQuery(String sqlString)EntityManagerください。使用createQuery(String ejbqlString)できるのは、EJBQLを使用している場合のみです。それがお役に立てば幸いです。

于 2013-01-03T15:14:42.047 に答える