3

エンティティに特定のインターフェイスを実装させたいのですが、これはIDを返します。

public interface IdentifiableEntity<T extends Comparable<T>> {
    public T getIdentifier();
}

しかし、そうしてエンティティが遅延ロードされた場合getIdentifier()、プロキシを初期化します(そして別の選択を引き起こします)。エンティティの例を次に示します。

@Entity
public class AppFile implements IdentifiableEntity<Long> {

    @Id
    @GeneratedValue
    private Long id;

    public Long getIdentifier() {
        return id;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    ...

}

getIdentifier()既知のIDにのみアクセスし、プロキシを初期化する必要がないことをHibernate / JPAに伝える方法はありますか?

私がすでに知ったこと:

  1. すべてのフィールドでgetId()はなくプロパティ(ゲッター)に注釈を付けると、プロキシが初期化されません。
  2. それを使用@Access(AccessType.PROPERTY)するprivate Long id;と、プロパティレベルですべてに注釈を付ける必要なしに1.として動作します。

更新: 1。と2.の両方がまだ私の要件を満たしていません。

  • getIdentifier()プロキシ初期化なしでIDを返します
  • フィールドのid名前は変更されません(既存のJPQLステートメントが多数あるため)。
4

3 に答える 3

0

getId()プロキシを初期化するメソッド。メソッドをリダイレクトする必要がありgetIdentifier()ます。

public Long getId() {
    return getIdentifier();
}
于 2012-10-19T08:19:36.403 に答える
0

フィールドに注釈を使用する場合でも、Java Reflection API を使用して id 値に直接アクセスできます。ここでは、コードを短くするために org.easytesting fest-reflect API (Reflection API の薄いラッパー) を使用します。proxy.handler.id の下の id 値。私の例は、部門 (潜在的なプロキシ) への ManyToOne を持つ従業員です。私の場合、ID は常に Long です ....

public Long extractIdFromDepartment(Employee employee) {

    Long idDepartment = null;

    Department departement = employee.getDepartment();
    Boolean isNotProxy = Persistence.getPersistenceUtil().isLoaded(departement);

    if (isNotProxy) {
        // here, department is not a proxy
        // a direct access is always ok
        idDepartment = departement.getId();
    } else {
        // here department IS a proxy
        // works in all cases : with Hibernate/JPA annotations on getters or fields.
        javassist.util.proxy.MethodHandler handler = Reflection.field("handler")
                .ofType(javassist.util.proxy.MethodHandler.class).in(departement).get();
        java.io.Serializable idDep = Reflection.field("id").ofType(java.io.Serializable.class).in(handler).get();
        if (idDep instanceof Long) {
            idDepartment = (Long) idDep;
        }
    }
    return idDepartment;
}
于 2016-05-10T11:10:48.013 に答える