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 エンティティでジェネレーション ギャップ パターンを実現するにはどうすればよいですか?
ありがとう