2009-06-01 84 views
4

當select包含跨多個集合的連接時,我無法獲得hibernate select來返回正確填充的對象圖。休眠 - 通過多個集合進行集合選擇

如:

String sql = "select distinct changeset " + 
      "from Changeset changeset " + 
      "join fetch changeset.changeEntries as changeEntry " + 
      "join fetch changeEntry.repositoryEntity as repositoryEntity " + 
      "join fetch repositoryEntity.repository as repository " + 
      "where repository.connectionName = :connectionName"; 
  • 一個變更有許多ChangeEntries
  • 一個ChangeEntry有一個RepositoryEntity
  • 一個RepositoryEntity有一個倉庫

上面的語句返回正確的數據,但對象圖沒有正確填充 - 即,每個Changeset都包含每個ChangeE不僅僅是自己的孩子。

下面是這兩個類的相關片段:

public class Changeset { 

    @NotNull 
    @OneToMany(mappedBy="changeset", targetEntity=ChangeEntry.class, cascade={CascadeType.ALL }, fetch=FetchType.EAGER) 
    private Set<IChangeEntry> changeEntries; 

而且......

public class ChangeEntry { 

    @NotNull 
    @ManyToOne(targetEntity=Changeset.class) 
    @ForeignKey(name="FkChangeEntryChangeset") 
    private IScmChangeset changeset; 

    @NotNull 
    @ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
    @ForeignKey(name="FkChangeEntryRepoEntity") 
    private IRepositoryEntity repositoryEntity; 

任何幫助是極大的讚賞

問候

馬蒂

+0

您添加了Repository的映射信息,而不是ChangeEntry中的ChangeSet。 – rudolfson 2009-06-02 12:10:38

+0

謝謝 - 我已經添加了Changeset – 2009-06-02 12:35:48

回答

1

馬蒂:

我有這個相同的問題,我找不到合適的解決方案。您可以使用簡單的結果變換器來控制返回的對象的數量:

CriteriaSpecification.ROOT_ENTITY 
CriteriaSpecification.DISTINCT_ROOT_ENTITY 

但是對象將始終包含其子項的完整結果。我確實發生過一篇優秀的文章,它使用DTO模式以及投影和變換器。

這就是:http://swik.net/Hibernate/Hibernate+GroupBlog/Hibernate+3.2:+Transformers+for+HQL+and+SQL/cmxs

這爲我運作良好。最大的問題是你必須創建這些扁平的DTO對象。對我來說,這不是一個大問題,因爲我的專用DTO對象用在搜索結果中,並且是非常可重用的,再加上我不需要其中的很多。

我知道這並不直接解決您的問題,如果您確實找到了實現您的目標的方法,請更新帖子,因爲我很樂意看到解決方案。

0

加載一個實體的ID是否正常工作?如果沒有 - 繼續閱讀。 :-)

我不確定使用@ForeignKey是否足夠。嘗試添加一個@JoinColumn到你的關係的許多方面。例如。

@NotNull 
@ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
@ForeignKey(name="FkChangeSet") 
@JoinColumn(name = "CHANGESET_ID", referencedColumnName = "ID") 
private Changeset changeset; 

注:我剛剛看到,那你表示Repository的映射信息,但我相信一個爲Changeset長相相似。