即使懒惰,也已加载休眠@OneToOne

问题描述 投票:-1回答:1

我正在使用Spring Boot 2.3,Spring Data和Hibernate。

我有以下实体

@Entity
@Getter
@Setter
@EqualsAndHashCode(of = "id")
public class User {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    private String name;

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    private Address address;

    @Version
    private Long version;
}

@Entity
@Getter
@Setter
@EqualsAndHashCode(of = "id")
public class Address {

    @Id
    private Long id;

    private String fullAddress;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id")
    @MapsId
    private User user;

    @Version
    private Long version;    
}

执行以下代码时,将执行与用户存储库相关的任何查询(对我而言,这是预期的行为。)>

Address addressFromDb = addressRepository.findAll().get(0);
log.info("" + addressFromDb.getUser().getId());

// select address0_.id as id1_0_, address0_.full_address as full_add2_0_, address0_.version as version3_0_ from address address0_

但是当我执行以下代码时,就会有多个查询,而我不明白为什么。显然,从用户到地址的FetchType.LAZY不被接受。

User userFromDb = userRepository.findAll().get(0);

// select user0_.id as id1_4_, user0_.name as name2_4_, user0_.version as version3_4_ from user user0_
// select address0_.id as id1_0_0_, address0_.full_address as full_add2_0_0_, address0_.version as version3_0_0_ from address address0_ where address0_.id=?

我想念什么?

为了更有用和更清晰,我创建了以下github repo

我正在使用Spring Boot 2.3,Spring Data和Hibernate。我有以下实体@Entity @Getter @Setter @EqualsAndHashCode(of =“ id”)公共类User {@GeneratedValue(strategy = ...

java spring hibernate spring-data hibernate-mapping
1个回答
2
投票

休眠(或更具体地说是PersistenceContext)需要知道该实体是否存在,以便它可以决定是为该实体还是null提供代理。这不适用于XToMany关系,因为整个集合可以包装在一个代理中,在特殊情况下它将为空。

© www.soinside.com 2019 - 2024. All rights reserved.