Hibernate@OneToOne即使使用@Fetch(FetchMode.JOIN)也会执行多个查询

Hibernate@OneToOne即使使用@Fetch(FetchMode.JOIN)也会执行多个查询,hibernate,query-optimization,fetch,one-to-one,Hibernate,Query Optimization,Fetch,One To One,考虑和员工和地址的关系。在员工和地址之间存在一对一的映射。以下是模型: @Entity @Table(name = "Address") public class Address { @Id @GeneratedValue @Column(name = "addressId") private int addressId; @Column(name = "city") private String city; . . } @E

考虑和
员工
地址
的关系。在
员工
地址
之间存在一对一的映射。以下是模型:

@Entity
@Table(name = "Address")
public class Address
{
    @Id
    @GeneratedValue
    @Column(name = "addressId")
    private int addressId;

    @Column(name = "city")
    private String city;

    .
    .
}

@Entity
@Table(name = "Employee")
public class Employee
{
    @Id
    @Column(name = "employeeId")
    private int employeeId;

    @Column(name = "name")
    private String name;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "addressId")
    @Fetch(FetchMode.JOIN)
    private Address address;

    .
    .
}
现在,当我执行以下HQL查询时,它会在内部生成两个查询。一个用于提取员工,另一个用于提取地址

”来自员工,其中id=“+1

由Hibernate生成的SQL查询

Hibernate:从employee0中选择employee0。employeeId为employeeId0,employee0。addressId为addressId0,employee0。name为name0,其中employee0。employeeId=1

Hibernate:从Address-Address-Address-0中选择address0\u0.Address-id作为addressId1\u-0\u0,address0\u0.city作为city1\u-0\u0,其中address0\u0.addressId=?

由于我使用的是
@Fetch(FetchMode.JOIN)
,所以我希望Hibernate只执行一个带有JOIN的查询来一次性获取员工和地址数据

你知道为什么它要执行两个查询吗?我如何让Hibernate使用join只执行一个查询

我使用的是Hibernate 3.3.0。

@OneToOne(fetch=FetchType.EAGER)
@fetch(FetchMode.JOIN)
与前面提到的一样,您渴望加载
地址
,这意味着无论何时
要求员工
获取
地址
,根据

仅当您访问关联时,才会执行第二次选择

这意味着对
地址的查询只有在您访问它时才会执行,因此您应该使用
@Fetch(FetchMode.SELECT)
@OneToOne(Fetch=FetchType.LAZY)

更新:

当使用@Swathi的post
FetchMode
时,Hibernate总是忽略对它的引用,在这种情况下,它将为每个单独的实体、集合或联接加载使用select。这意味着你必须创造并加入你自己

对于延迟加载,Hibernate将忽略通过注释提供的
FetchType
,但如果映射是通过XML完成的,例如
Employee.hbm.XML
,则使用类似的东西

 <one-to-one name="address" fetch="join" class="**PACKAGE**.Address"
        constrained="true" ></one-to-one>

然后Hibernate将尊重延迟加载,并且仅执行第一个select语句。如果
lazy=“false”
设置为一对一
,则它将执行两个select语句

使用显式HQL查询“FROM Employee WHERE id=“+1”,Hibernate将不遵守带注释的获取模式。您需要在HQL查询中指定联接或在条件中指定获取模式


当您使用查询接口(Session.createQuery)时,Hibernate 3.x会忽略Fetch模式注释,因此在这种情况下,您必须向查询的FROM部分添加一个内部JOIN Fetch子句。

我想知道的是,为什么它会执行两个单独的查询(一个用于加载员工,另一个用于加载地址)尽管我已经指定了FetchMode.JOIN?但它可以通过一个连接查询来加载员工和地址。或者有没有方法可以指示hibernate使用一个连接查询来使用一个查询来加载两个模型?感谢您的解释。使用内部连接获取导致执行一个查询。我应该在哪里写入内部JO在FETCH中,如果我使用的是From Employee queryI,我遇到了@SanketMeghani报告的相同问题。我想知道为什么Hibernate在这种情况下不尊重注释。对此有什么合理的解释吗?