Hibernate - 使用集合选择多个连接

时间:2009-06-01 19:35:42

标签: java hibernate

当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包含每个ChangeEntry,而不仅仅是它自己的子项。

以下是这两个类的相关摘要:

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;

非常感谢任何帮助

此致

玛蒂

2 个答案:

答案 0 :(得分:1)

玛蒂:

我有同样的问题,我找不到合适的解决方案。您可以使用简单的结果转换器来控制返回的对象数量:

CriteriaSpecification.ROOT_ENTITY
CriteriaSpecification.DISTINCT_ROOT_ENTITY

但是对象总是包含他们孩子的完整结果。我确实遇到过一篇优秀的文章,该文章使用了DTO模式以及投影和aliasToBean变换器。

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

这对我来说效果很好。最大的问题是你必须创建这些扁平化的DTO对象。对我而言,这不是一个大问题,因为我的专业DTO对象在搜索结果中使用并且非常可重复使用,而且我不需要很多它们。

我知道这并不直接解决您的问题,如果您确实找到了实现目标的方法,请更新帖子,因为我很乐意看到解决方案。

答案 1 :(得分:0)

通过其ID加载一个实体是否正常工作?如果没有 - 请继续阅读。 : - )

我不确定使用@ForeignKey是否足够。尝试在关系的多方面添加@JoinColumn。 E.g。

@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的映射信息看起来很相似。