【发布时间】:2014-09-21 09:07:52
【问题描述】:
我有以下两个 POJO:
@Entity
@Table
@Data
@EqualsAndHashCode(of={"identifier"})
@ToString(of={"identifier"})
public class Project {
@Column
@Id
@GeneratedValue
private Integer identifier;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.project")
private Set<MemberToProject> members = new HashSet<MemberToProject>();
}
@Entity
@Data
@Table
@EqualsAndHashCode(of={"identifier"})
@ToString(of={"identifier"})
public class Member {
@Column
@Id
@GeneratedValue
private Integer identifier;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.member")
private Set<MemberToProject> projects = new HashSet<MemberToProject>();
}
连接表的POJO如下:
@Entity
@Table
@Data
public class MemberToProject {
@Embeddable
@Data
public static class PrimaryKey implements Serializable {
@ManyToOne
private Member member;
@ManyToOne
private Project project;
}
@Column
@EmbeddedId
private PrimaryKey primaryKey;
}
我想要一个单独的 POJO 用于连接表,这样我就可以添加属性,例如成员加入项目的日期、成员的权限等。为简洁起见,我省略了。
我用一些数据填充我的数据库并执行以下代码:
final Session s = ...;
final Member m = (Member) s.load(Member.class, 3);
System.out.println(m.getProjects());
Hibernate 生成以下三个查询:
Hibernate:
select
member0_.identifier as identifi1_1_0_,
member0_.name as name2_1_0_
from
Member member0_
where
member0_.identifier=?
Hibernate:
select
projects0_.member_identifier as member1_1_1_,
projects0_.member_identifier as member1_4_1_,
projects0_.project_identifier as project2_4_1_,
projects0_.member_identifier as member1_4_0_,
projects0_.project_identifier as project2_4_0_
from
MemberToProject projects0_
where
projects0_.member_identifier=?
Hibernate:
select
project0_.identifier as identifi1_6_0_,
project0_.name as name2_6_0_
from
Project project0_
where
project0_.identifier=?
Hibernate 在此处生成低效查询。 membertoproject 中的 project 和 member 之间没有连接。我相信第二个和第三个查询可以/应该结合起来。我怎样才能做到这一点?
另外,第二个查询多次检索同一列,出于某种原因,我不明白。
【问题讨论】:
-
注解
@Data、@EqualsAndHashCode和@ToString来自Lombok项目。
标签: hibernate join many-to-many inner-join