@OneToOne 연관관계일 때 지연 로딩으로 설정하면 어떤 일이 발생할까요? #203
Replies: 2 comments
-
@OnetoOne 연관관계일 때 지연 로딩으로 설정하면 다음과 같은 상황이 발생할 수 있음을 고려해야 합니다.
지연 로딩은 로딩되는 시점에 엔티티를 프록시 객체로 가져오게 됩니다. 하지만 프록시 객체의 경우 null로 감쌀 수 가 없습니다. 예를 들어, 아래와 같은 엔티티가 있다고 가정하면, @Entity
public class User {
@Id
@GeneratedValue
@Column(name = "USER_ID")
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STATUS_ID")
private Status status;
}
@Entity
public class Status {
@Id
@GeneratedValue
@Column("CART_ID")
private Long id;
@OneToOne(mappedBy = "status", fetch = FetchType.LAZY)
private User user;
} USER TABLE
STATUS TABLE
이 상태에서 연관 관계 주인인 USER의 경우 각 칼럼 자신이 어떤 STATUS와 연관 관계를 가지고 있는지 알 수 있기 때문에 USER의 경우 Lazy로 정상 동작하지만 |
Beta Was this translation helpful? Give feedback.
-
양방향 db 테이블 관점에서 연관관계의 주인이 아닌 엔티티는 fk가 존재하지 않아서 엔티티의 존재 여부를 알지 못합니다. User @Entity(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
private Account account;
protected User() {
}
public Account getAccount() {
return account;
}
} Account @Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
private User user;
protected Account() {
}
public Account(User user) {
this.user = user;
}
} Test @Test
void lazyTest() {
userRepository.save(new User());
User user = userRepository.findById(1L).orElseThrow();
assertThat(user.getAccount()).isNull();
} Reference : https://thorben-janssen.com/hibernate-tip-lazy-loading-one-to-one/ |
Beta Was this translation helpful? Give feedback.
-
뭘까요
Beta Was this translation helpful? Give feedback.
All reactions