Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate对@OneToOne join执行多个查询_Hibernate_Jpa - Fatal编程技术网

Hibernate对@OneToOne join执行多个查询

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

我使用的是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_ ) 
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**