努力使用注释来描述 JPA 或 Hibernate 关系

Struggling to describe JPA or Hibernate relationship using annotations

以下是描述实际问题的简化版架构。

考虑以下三个 类。 MetaDataInfo 存储有关各种元数据 table 的当前版本。列 "isCurrent" 指向当前活动的版本。

@Entity
class MetaDataInfo
{
   @Column
   int version;
   @Column
   String type;
   @Column
   boolean isCurrent;
}

@Entity
VersionedInfo {
  @Column
  int version;
}

@Entity
Data {

  VersionedInfo info;
}

当从数据库中读取数据时,是否可以使用注释询问休眠自动提供来自数据 table 的 VersionedInfo - 就像它对其他关系所做的那样。从 SQL 的角度来看,查询将如下所示

select * from VersionedInfo where version = (select version from MetaDataInfo where isCurrent = true and type = "VersionedInfo")

您可以使用 Hibernate filters 来实现此功能,使用您的位置创建过滤器,并在查询之前激活它。 (这不符合 JPA)

像这样:

@Entity
class MetaDataInfo
{
   @Column
   int version;
   @Column
   String type;
   @Column
   boolean isCurrent;
}

@Entity
@FilterDef(name="lastInfo")
VersionedInfo {
  @Column
  @Filter(name="lastInfo", condition="(version = (select version from MetaDataInfo where isCurrent = true and type = \"VersionedInfo\")"
  int version;
}

@Entity
Data {

  VersionedInfo info;
} 

以及用法:

session.enableFilter("lastInfo")
// queries
session.disableFilter("lastInfo")