【发布时间】:2021-11-12 03:49:03
【问题描述】:
我有两个实体
@Entity
@Table(name = "user")
@Data
@Builder
@EqualsAndHashCode(callSuper=false)
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "name")
private String name;
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@PrimaryKeyJoinColumn
private UserLastLogin userLastLogin;
}
@Entity
@Table(name = "lastLogin")
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@ToString(onlyExplicitlyIncluded = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserLastLogin implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "name")
private String userName;
@Column(name = "date")
private LocalDateTime date;
@OneToOne
@MapsId
@JoinColumn(name = "name")
private User user;
}
我使用带有 spring data 和 jpa 的 spring boot,在最新版本中休眠。 在文档中,@OneToOne 是默认的 EAGER,但是当我急切获取对象时,当我在 get 方法中不使用 @Transactional 时,我会得到lazyInitializationException。我不明白为什么...
public UserDto getUser(String userName) {
var user= userRepository.getById(userName);
d.getSystemUserLastLogin(); // this throw lazy initialization exception
return mapper.entityToDto(d);
}
当我将这个方法标记为@Transactioal 时,这个工作。但是,不建议在 get 方法中使用事务。我需要在这种关系中使用 EAGER fetch。
当我查看查询休眠时,我有一个选择,但子对象不可用。
Hibernate:
select
user0_.name as nazwa1_4_0_,
user2_.name as name1_23_2_,
user2_.data as data3_23_2_
from
user0_
left outer join
last_login user2_
on user0_.name=user2_.name
where
user0_.name=?
【问题讨论】:
标签: spring-boot hibernate spring-data-jpa spring-data one-to-one