프로젝트를 만들면서 필요한 부분을 정리하고 있습니다.
모호하거나, 잘못된 부분이 있으면 댓글로 남겨주세요! 감사합니다 :)
class
위에 기재함id
, name
이 반복 되므로, BaseEntity 라는 클래스로 따로 만들어서 이 클래스 내부 변수로 만들어준다음에,Member
, Seller
가 해당 클래스를 상속받는 형식으로 진행된다.@Getter
@Setter
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
@Entity
public class Member extends BaseEntity {
//...
}
@Entity
public class Team extends BaseEntity {
//...
}
BaseEntity를 상속(extends) 받았다.
위와 같이 설정했을 때, 만들어지는 DDL(Data Definition Language)
Hibernate:
create table Member (
id bigint generated by default as identity,
createdBy varchar(255),
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
age integer,
description clob,
roleType varchar(255),
name varchar(255),
locker_id bigint,
team_id bigint,
primary key (id)
)
Hibernate:
create table Team (
id bigint generated by default as identity,
createdBy varchar(255),
createdDate timestamp,
lastModifiedBy varchar(255),
lastModifiedDate timestamp,
name varchar(255),
primary key (id)
)
@Entity
@AttributeOverride(name = "createdDate", column = @Column(name = "publishedAt"))
public class Member extends BaseEntity {
//...
}
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
// 근무 기간
@Temporal(TemporalType.DATE)
Date startDate;
@Temporal(TemporalType.DATE)
Date endDate;
// 집 주소 표현
private String city;
private String street;
private String zipcode;
// ...
}
@Entity
public class Member {
@Id @GeneratedVAlue
private Long id;
private String name;
@Embedded //실제 사용되는 엔티티 변수 위에
private Period workPeriod;
@Embedded
private Address homeAddress;
}
@Embeddable //값 타입의 class
public class Period {
@Temporal(TemporalType.DATE)
private Date startDate;
@Temporal(TemporalType.Date)
private Date endDate;
// ...
}
@Embeddable
public class Address {
@Column(name="city") // 매핑할 컬럼 정의 가능
private String city;
private String street;
private String zipcode;
// ...
}
@EntityListeners(DataDtoListener.class) // {} 를 통해서, 복수의 리스너를 등록할 수 있음
@Entity
public class DataDto() {
@Id
private long id;
//...
}
public class DataDtoListener {
@PostLoad
public void postLoad(DataDto dto) {
log.info("post load: {}", dto);
}
@PrePersist
public void prePersist(DataDto dto) {
log.info("pre persist: {}", dto);
}
@PostPersist
public void postPersist(DataDto dto) {
log.info("post persist: {}", dto);
}
@PreUpdate
public void preUpdate(DataDto dto) {
log.info("pre update: {}", dto);
}
@PostUpdate
public void postUpdate(DataDto dto) {
log.info("post update: {}", dto);
}
@PreRemove
public void preRemove(DataDto dto) {
log.info("pre remove: {}", dto);
}
@PostRemove
public void postRemove(DataDto dto) {
log.info("post remove: {}", dto);
}
}
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdTimeAt;
}
@EnableJpaAuditing
을 적용하여 JPA Auditing을 활성화 해야한다.AuditingEntityListener
클래스의 경우, 붙여놓으면, Entity가 생성, 수정등의 액션에서 특정 컬럼(수정시간, 생성시간, 생성자, 수정자)에 대해 자동으로 DB에 맵핑되도록 도와준다.Auditing
기능을 사용하려면, 위의 어노테이션을 사용해야한다.@EnableJpaAuditing
이 필수적으로 SpringApplication 시작에 있어야 하고@MappedSuperclass, @AttributeOverride
@Embeddable, @Embedded
@EntityListeners, AuditingEntityListener
참고사이트