【发布时间】:2014-09-05 18:50:37
【问题描述】:
我有三个实体,一个父母有两个孩子,但我在这里只列出了两个实体。
@Entity
@Table(name = "person")
public class Person{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@Column(name = "name")
private String name;
@OneToMany(fetch=FetchType.EAGER)
private Set<Phone> phones = new HashSet<Phone>();
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name="person_id", referencedColumnName="id")
private List<Book> books = new ArrayList<Book>();
}
@Entity
@Table(name = "book")
public class Book{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@Column(name="person_id")
private Long personId;
}
当我按照 Hibernate 标准运行并从 SQL 生成的日志中注意到时,它正在将两个孩子 - 电话和书籍连接在一起。我和这两个孩子没有任何关系。为什么从 Hibernate 条件生成的 SQL 查询会尝试加入不相关的两个孩子?我希望加入发生在父母和孩子之间,而不是孩子之间。
Criteria criteria = session.createCriteria(Person.class)
.add(Restrictions.in("id", ids))
.setFetchMode("phones", FetchMode.JOIN).setFetchMode("books", FetchMode.JOIN)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
result = criteria.list();
【问题讨论】:
标签: hibernate hibernate-mapping hibernate-criteria