带@MappedSuperclass的JPA静态元模型(带有一点生成间隙模式)

时间:2012-10-24 11:57:17

标签: jpa code-generation criteria-api metamodel

我尝试用JPA实体实现Generation Gap Pattern。 这是我们选择的解决方案(< - 是继承)

BaseEntity <-- EntityGenerated <-- Entity

EntityGenerated类型是抽象的并使用@MappedSuperclass进行映射,所有字段都使用正确的映射注释生成,关系指向具体的子类,而不是生成的子类。

实体是一种具体类型,仅在类不存在时生成,最初只有使用@Entity注释的类声明。其他映射属性(如@Table等)位于生成的orm.xml中。

现在,当我们生成jpa静态元模型(使用hibernate或openjpa元模型生成器)时,生成的类看起来像:

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是子类类型)

    < / LI>
  • 为什么jpa标准Path api没有为多个attribut定义get方法

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

  • 如何在不放弃条件查询的情况下在JPA实体上实现代间隙模式?

由于

0 个答案:

没有答案