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