2

永続エンティティに依存性注入を導入したいのですが、どうすればよいかわかりません。

私のGWTアプリケーションのソルトハッシュアルゴリズムには、Base64の実装が必要でした。GWTには、古いバージョンのcommons-codecが付属しています。名前の競合(私はMavenを使用していません)のため、古いものを使用する方法を理解するか、Base64.iharder.netなどの別の実装を使用することができました。

いくつかの選択肢を採用した後、それぞれにインターフェイスとアダプタのクラスを作成しました。1つの実装を注入しました。それは古典的なユースケースのように見えました。

永続エンティティが作成されたとき、すべてがうまく機能しました。ただし、それらを保存および取得した後、以前に挿入されて永続化されなかったフィールドは、null値でインスタンス化されました。

この問題は完全に理にかなっています。引数なしのコンストラクターを追加するDataNucleusを使用します。DataNucleusは依存関係を再度注入しません。

データストアからオブジェクトを取得するときに、永続性フレームワークに依存関係を再挿入するように依頼するにはどうすればよいですか?

ありがとうございました。

// salted hash for password storage

@PersistenceCapable
public class SaltedHash implements Serializable {

  private static final long serialVersionUID = 1L;

  private String salt;
  private String hash;

  @NotPersistent
  private final Base64Codec base64Codec;
  @NotPersistent
  private final Sha265Hash sha256Hash;
  @NotPersistent
  private final Random random;

  @Inject
  public SaltedHash(Base64Codec b64, Sha256Hash sha256, Random rnd) {
    base64Codec = b64;
    sha256Hash = sha256;
    random = rnd;
  }

  public void setSecret(String secret) {
    salt = base64Codec.encode(generateSalt());
    hash = base64Codec.encode(sha256Hash.hash(salt + secret));
  }

  public boolean matches(String secret) {
    String maybe = base64Codec.encode(sha256Hash.hash(salt + secret));
    return hash.equals(maybe);
  }

  private byte[] generateSalt() {
    // use random to generate a salt
  }
}
4

1 に答える 1

3

通常、永続エンティティのライフサイクルは、マネージド Bean のライフサイクルから切り離されます。そのため、JPA 管理エンティティで DI / CDI を使用することはむしろ推奨されません。

この定義によれば、JPA エンティティは技術的に管理された Bean です。ただし、エンティティには独自の特別なライフサイクル、状態、および ID モデルがあり、通常は JPA または new を使用してインスタンス化されます。したがって、エンティティ クラスを直接注入することはお勧めしません。JPA は挿入された CDI プロキシを永続化できないため、 @Dependent 以外のスコープをエンティティ クラスに割り当てないことを特にお勧めします。

状況は DataNucleus に似ていると思います。特にこれ...

データ ストアからオブジェクトを取得するときに、永続化フレームワークに依存関係を再注入するように依頼するにはどうすればよいですか?

...依存関係はいくつかのコンステレーション(読み取り:スコープ)でプロキシされますが、他のコンスタレーションでは直接注入されるため、おそらく非常に注意が必要です。

エンティティが DI に依存しないようにモデルを再設計すると、はるかに簡単になると思います。

于 2012-07-25T10:55:51.073 に答える