java - 如果不能与查询和实体管理器一起使用,@MappedSuperclass 的意义何在?

标签 java hibernate jpa persistence jpa-2.0

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

@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 似乎不适用于映射的父类(super class))

查看 JPA documentation我发现:

Mapped superclasses cannot be queried and can’t be used in EntityManager or Query operations. You must use entity subclasses of the mapped superclass in EntityManager or Query operations. Mapped superclasses can’t be targets of entity relationships. Mapped superclasses can be abstract or concrete.

这是否意味着我在映射的父类(super class)中映射的字段都不能被标准查询中的扩展实体使用?如果是这样,将映射放入父类(super class)中有什么意义?如果不是,我做错了什么??

最佳答案

我的错。事实证明,这个问题的答案是“正确”使用 @StaticMetamodel 带注释的伴随类。映射的父类(super class)必须全部具有以相同方式继承的独立静态元模型(我已将实体的所有内容捆绑到一个元模型中,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;
}

关于java - 如果不能与查询和实体管理器一起使用,@MappedSuperclass 的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19321063/

相关文章:

java - 通过 SOAP 流式传输?

java - 如何从 servlet 内初始化 hibernate session ?

java - 在 Hibernate 中同时使用 Query Api 和 Criteria Api 会导致问题

java - Gradle Hibernate 配置需要映射类

Oracle CLOB和JPA/Hibernate ORDER BY?

java - 启用调试日志记录时,apache httpclient 以明文形式记录密码

java - org.springframework.dao.DataIntegrityViolationException : could not execute statement; SQL [n/a]; constraint [admin_pkey]; 错误

java - Android 和 Java 的 Retrofit REST 客户端不会终止

Spring JPA 存储库无法解析实体的属性

java - JPA(和/或 Hibernate)- 如何设置连接和/或查询的超时阈值?