일자 관련 자동 처리를 위한 Entity - EntityListener
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class AuditableEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
1. 1:1 단방향 관계
@Entity
@NoArgsConstructor
@Data
public class User extends AuditableEntity {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToOne
private Address address;
}
@Entity
@NoArgsConstructor
@Data
public class Address extends AuditableEntity {
@Id
@GeneratedValue
private Long id;
private String city;
private String street;
}
- User가 관계의 주인
- address_id 외래키가 User 테이블에 생성됨
- Address에서는 User 참조가 없음 (단방향)
2. 양방향 관계 + mappedBy 사용
@Entity
@NoArgsConstructor
@Data
public class User extends AuditableEntity {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToOne(mappedBy = "user")
@ToString.Exclude
private Address address;
}
@Entity
@NoArgsConstructor
@Data
public class Address extends AuditableEntity {
@Id
@GeneratedValue
private Long id;
private String city;
private String street;
@OneToOne
private User user;
}
- Address가 관계의 주인 (외래키 보유)
- User는 mappedBy = "user"로 연관관계 주인이 아님
- 양방향 관계이지만 외래키는 Address에 있음
- 양방향 관계를 사용할 때 순환 참조를 조심해야한다. 따라서 사용할 이유가 있을 경우에는 한쪽에 @ToString.Exclude 를 사용하여 순환 참조를 방지