2

我有一些表有一些公共列,我认为在创建实体时我会让实体扩展一个定义所有映射的类:

@MappedSuperclass
public class AbstractLogMaster implements Serializable
{
  @Id
  @Basic(optional = false)
  @Column("id")
  protected long id;

  @Column("field1")
  protected String field1;

  @Column("field2")
  protected String field2;

  public long getId()
  {
    return id;
  }

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

  etc...
}

@Entity
@Table(name = "logwork")
public class LogWork extends AbstractLogMaster implements Serializable
{
  @Column("field3")
  protected int field3;

  public int getField3()
  {
    return field3;
  }
}

在查询中使用它Predicate p1 = builder.equal(logWork.get(LogWork_.field1), f1);会导致 NPE(特别是因为这logWork.get(LogWork_.field1)部分 - @StaticMetaModel 似乎不适用于映射的超类)

查看JPA 文档,我发现:

映射的超类不能被查询,也不能在 EntityManager 或 Query 操作中使用。您必须在 EntityManager 或 Query 操作中使用映射超类的实体子类。映射的超类不能成为实体关系的目标。映射的超类可以是抽象的或具体的。

这是否意味着我在映射超类中映射的所有字段都不能被条件查询中的扩展实体使用?如果是这样,将映射放入超类有什么意义?如果没有,我做错了什么?

4

1 回答 1

0

我的错。原来这个问题的答案是“正确”使用带@StaticMetamodel注释的伴随类。映射的超类必须都具有以相同方式继承的单独静态元模型(我已将实体的所有内容捆绑到一个元模型中,LogWork_

@StaticMetamodel(AbstractLogMaster.class)
public final class AbstractLogMaster_
{
  public static volatile SingularAttribute<AbstractLogMaster, Long> id;
  public static volatile SingularAttribute<AbstractLogMaster, String> field1;
  public static volatile SingularAttribute<AbstractLogMaster, String> field2;
}

@StaticMetamodel(LogWork.class)
public final class LogWork_ extends AbstractLogMaster_
{
  public static volatile SingularAttribute<LogWork, Integer> field3;
}
于 2013-10-11T15:56:31.980 回答