当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";
上面的语句返回正确的数据,但是对象图没有正确填充 - 即,每个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;
非常感谢任何帮助
此致
玛蒂
答案 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
的映射信息看起来很相似。