5

JPAエンティティでGeneration Gap Patternを実現しようとしました。これが私たちが選択した解決策です(<--は継承です)

BaseEntity <-- EntityGenerated <-- Entity

EntityGenerated 型は抽象型であり、@MappedSuperclass でマップされます。すべてのフィールドは、生成されたものではなく、具体的なサブクラスへのリレーション ポイントである正しいマッピング アノテーションで生成されます。

Entity は具象型であり、クラスが存在しない場合にのみ生成されます。最初は、@Entity で注釈が付けられたクラス宣言だけがあります。@Table などの他のマッピング属性は、生成された orm.xml にあります。

ここで、(hibernate または openjpa メタモデル ジェネレーターを使用して) jpa 静的メタモデルを生成すると、生成されたクラスは次のようになります。

public class BaseEntity_ {
    public static volatile SingularAttribute<PersistentDomainObject,Long> id;
    public static volatile SingularAttribute<PersistentDomainObject,Long> timeStamp;
}

public class UserGenerated_ extends BaseEntity_ {
    public static volatile SetAttribute<UserGenerated,Group> groups;
}

public class User_ extends UserGenerated_  {
}

jpa 基準クエリで User_ を使用する場合は、次のようにします。

CriteriaQuery<User> query = criteriaBuilder.createQuery(User.class);
Root<User> root = query.from(User.class);
query.where(root.get(User_.groups).in(paramGroups));

しかし、コンパイルされません.... User_.groups は SetAttribute 型であり、get メソッドの jpa パス API は次のとおりです。

<E, C extends java.util.Collection<E>> Expression<C> get(PluralAttribute<X, C, E> collection);

(比較すると、単数属性の get メソッドは

<Y> Path<Y> get(SingularAttribute<? super X, Y> attribute)

ウィッチワークベター)

だから、今、質問は次のとおりです。

  • 直接クエリする方法がないため、メタモデル ジェネレーターが MappedSuperclass のクラスを生成するのはなぜですか? スーパークラスの属性と関係は、各サブクラスで定義する必要があります (X はサブクラス タイプです)。

  • jpa基準パスAPIが複数属性のgetメソッドを次のように定義しない理由

    get(PluralAttribute<? super X, C, E> collection)
    

    ?

  • 条件クエリをあきらめずに JPA エンティティでジェネレーション ギャップ パターンを実現するにはどうすればよいですか?

ありがとう

4

0 に答える 0