ManyToOne关系的反面项目列表

时间:2016-07-28 19:57:00

标签: java hibernate jpa

所以我有一个在我的数据库中有修订的文档。文档表包含文档的通用元数据,修订包含内容。目前,我可以使用正确的版本获取文档。

我想要做的是通过映射获取所有修订版的文档列表。

以下是我的两个实体:

@Entity
public class Document {
   @Id
   @Column(name="DOCUMENT_ID")
   private int id;

   @ManyToOne
   @JoinColumn(name="DOCUMENT_REVISION_ID")
   private DocumentRevisionEntity revision;
}

@Entity
public class DocumentRevisionEntity {
   @Id
   @Column(name="DOCUMENT_REVISION_ID")
   private int id;

   @Column(name="DOCUMENT_ID")
   private int documentId
}

那么我希望查询所有修订版本的JPA查询,但返回类型为Document

1 个答案:

答案 0 :(得分:1)

执行所需操作的简便方法是修改Document实体。

您需要添加一个List<DocumentRevisionEntity>,表示它将代表与Document实例关联的所有修订版...示例:

@Entity
public class Document {
@Id
@Column(name="DOCUMENT_ID")
private int id;

@ManyToOne
@JoinColumn(name="DOCUMENT_REVISION_ID")
private DocumentRevisionEntity revision;  // This is the last revision!

@OneToMany
@JoinColumn(name="DOCUMENT_ID") // unidirectional one-to-many, works for JPA2.0!!
private List<DocumentRevisionEntity> revisions = new ArrayList<>();
}

然后当您从持久层检索文档时,您还可以检索其关联的修订版本!

当心!默认情况下,@ OneToMany关系是LAZY,只有在需要时才会加载! (这是,当您从getRevisions()管理的Document实体调用方法EntityManager时。根据您的上下文,此配置可能会导致N+1子选择问题,因此请注意。

如果您不想修改您的实体 ...您可以测试此查询:

SELECT doc, rev FROM Document doc, DocumentRevisionEntity rev WHERE doc.id = rev.documentId

但是,当您从此查询中致电:query.getResultList()时;它将带来一个List<Object[]>,其中每个元素由一个数组组成:array [0] = Document,array [1] = DocumentRevisionEntity ...如果有多个版本的文档,这些文档将在结果中重复列表...