7

私の問題は分離天体にあります...

私は現在、HibernateでSpringを使用しています。

私は主キーを文字列として持つマップされたオブジェクトを持っています(私はそれが悪いことを知っています...しかしコードのリファクタリングには数ヶ月かかるでしょう)、そしてそれを永続させたいです。(2つの属性だけでオブジェクトを簡略化しました)

@Id
private String id;

private String pattern;

たとえば、次のようなものを追加したいと思います。

["id": "myFirstPattern"、 "pattern":"。*"]

主キーがすでに設定されていることに注意してください。それに関する問題は、私が永続化しようとすると、Hibernateがこのオブジェクトをコンテキスト内の任意のオブジェクトにリンクしようとし(主キーのため)、リンクがないために失敗することです。デタッチオブジェクトエラーをスローします。

私はいくつかの調査を行い、オブジェクトが利用できない場合でも、merge()が持続して更新されるため、merge()で十分であるという結論に達しました。ただし、これはかなり汚い回避策であることがわかり、この問題に対する他の解決策があるかどうかを確認したいと思いました。

ヘルパーレイヤーがあることを考慮に入れてください。そのため、サービスレイヤーはHibernateDaoレイヤーと直接連携しません。したがって、同じマージDAOメソッドを呼び出す「persist」メソッドと「update」メソッドを追加することで、これを「マスク」できます。

ありがとう、フラビオ。

4

3 に答える 3

1

マウリシオが私にくれたアイデアを試した後、私はいくつかの異なるアプローチを使ってみました。SaveOrUpdateはキャッシュされたエンティティを使用して、オブジェクトを更新または保存する必要があるかどうかを確認していたため、オブジェクトを保存する直前に明確にすることを考えました。

だから、これが私のコードです:

try {
        getHibernateTemplate().clear();
        getHibernateTemplate().save(entity);
    } catch (DataAccessException e) {
        if (e.getCause() instanceof ConstraintViolationException)
            throw new HibernateDaoException("Entity could not be persisted. Constraint violation.");
        throw new HibernateDaoException(e);
    }

今のところ、キャッシュされたデータベースが存在する理由がなくなるように見えますが、期待どおりに機能しています...ただし、コンポーネントの主な理由は情報を返し、パターンを照合し、最高の結果。

とにかく欠陥を見つけたらすぐに戻ります。

コメントがあれば、遠慮なく投稿してください:)

于 2011-07-29T14:19:04.853 に答える
1

saveOrUpdate を試しましたか?

Session sess = factory.openSession();
Transaction tx;
try {
    tx = sess.beginTransaction();
    session.saveOrUpdate( yourObjectHere );

    tx.commit();
}
catch (Exception e) {
    if (tx!=null) tx.rollback();
    throw e;
}
finally {
    sess.close();
}
于 2011-07-28T21:37:50.530 に答える
0

確信が持てず、今は自分で試すことはできませんが、「割り当てられた」ジェネレーターを使用するように @Id プロパティを設定しないと、まさにそれができませんか?

于 2011-07-29T03:37:07.543 に答える