Hibernate对@OneToOne join执行多个查询
我使用的是Hibernate3.6.10.Final,我使用的是Java1.6 结构:Hibernate对@OneToOne join执行多个查询,hibernate,jpa,Hibernate,Jpa,我使用的是Hibernate3.6.10.Final,我使用的是Java1.6 结构: @Entity class Test { @Id private String id; @OneToOne(mappedBy = "test") private Test_Team test_team; } 由Hibernate生成的SQL: SELECT * FROM (SELECT test0_.id FROM test test0_ ) W
@Entity
class Test
{
@Id
private String id;
@OneToOne(mappedBy = "test")
private Test_Team test_team;
}
由Hibernate生成的SQL:
SELECT *
FROM (SELECT test0_.id
FROM test test0_ )
WHERE rownum <= 1 // LIMIT 1
当我在TEST
上进行选择时,Hibernate不会查询TEST\u团队
和团队
如何避免这种情况,或者如何减少查询量?但是,加载时需要所有数据。这是一个获取问题。您的关系有一个
FetchType.EAGER
,因此Hibernate将加载所选模型的所有关系。您可以切换到FetchType.LAZY
,以避免所有连接,但并不总是一个好选择
因此,您的关系将成为:
@OneToOne
@JoinColumn(name="TEAM_ID", referencedColumnName="ID", insertable=false, updatable=false)
@OneToOne(fetch = FetchType.LAZY, targetEntity = Team.class)
private Team team;
看看急切获取和懒惰获取之间的区别,也许可以在谷歌上查找一些教程,以实现您的目标。这是一个获取问题。您的关系有一个
FetchType.EAGER
,因此Hibernate将加载所选模型的所有关系。您可以切换到FetchType.LAZY
,以避免所有连接,但并不总是一个好选择
因此,您的关系将成为:
@OneToOne
@JoinColumn(name="TEAM_ID", referencedColumnName="ID", insertable=false, updatable=false)
@OneToOne(fetch = FetchType.LAZY, targetEntity = Team.class)
private Team team;
看看急切获取和懒散获取之间的区别,也许可以在google上查找一些教程,以实现您的目标。解决方案是放弃联接表,并在测试团队之间直接引用 您看到的SQL很有意义,因为Hibernate无法知道TestTeam将是Test和Team引用的同一实体
Test test = .../
test.getTestTeam();//triggers load **where test_id = test.id**
Team team = test.getTestTeam().getTeam();
team.getTestTeam();// triggers load **where team_id = team.id**
解决方案是抛弃联接表,在测试团队之间直接引用 您看到的SQL很有意义,因为Hibernate无法知道TestTeam将是Test和Team引用的同一实体
Test test = .../
test.getTestTeam();//triggers load **where test_id = test.id**
Team team = test.getTestTeam().getTeam();
team.getTestTeam();// triggers load **where team_id = team.id**
我已经考虑过了,但我需要所有的东西都在加载时间。所以使用延迟获取不会有任何区别,我扩展了我的问题并添加了这些信息,我已经考虑过了,但我需要加载时的所有信息。所以使用LAZY fetch不会有任何区别,我扩展了我的问题并添加了这些信息
@OneToOne
@JoinColumn(name="TEAM_ID", referencedColumnName="ID", insertable=false, updatable=false)
@OneToOne(fetch = FetchType.LAZY, targetEntity = Team.class)
private Team team;
Test test = .../
test.getTestTeam();//triggers load **where test_id = test.id**
Team team = test.getTestTeam().getTeam();
team.getTestTeam();// triggers load **where team_id = team.id**