JPA Create And Update Value - redutan/redutan.github.io GitHub Wiki
Create And Update λΉκ΅
μμ
- λλ©μΈμμ ν΅μ¬ κ΄μ¬μ¬λ₯Ό κ΄ν΅νλ μ©λλ‘ μμμ΄λΌλ κ·μ€ν κΈ°νλ₯Ό μ¬μ©ν΄μΌνλ€κ³ λ΄.
- νμ§λ§ νμ ν©μκ° μλ€λ©΄ ꡬν νΈμλ₯Ό μν΄μ μμμ μ¬μ©νλ κ²λ νλμ λ°©λ²μ.
- κ°μΈμ μΌλ‘λ κΆμ₯νμ§ μμ
- νμ§λ§ λμ€μ μΌλ‘ κ°μ₯ λ§μ΄ μ°μ΄κ³ μκ³ κ°λ° μ νΈν¨
@Getter
@ToString
@EqualsAndHashCode
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
class BaseEntity {
@CreatedBy
private Long createdUserId
@CreatedDate
private Date createdAt;
@LastModifiedBy
private Long lastModifiedUserId
@LastModifiedDate
private Date lastModified;
}
@Configuration
@EnableJpaAuditing // μ΄ μ€μ μ΄ μμ΄μΌμ§ μ μ΄λ
Έν
μ΄μ
μ΄ μ μμλ
class JpaConfig {
@Bean
public AuditorAware<AuditableUser> auditorProvider() {
return new MyAuditorAware(); // μ¬μ©μ μ‘°ν μ©
}
}
CreateAndUpdate
- λ±λ‘κ³Ό μμ μ 보과 ν΅ν©λ ννμ κ°κ°μ²΄
@Embeddable
@Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor
public class CreateAndUpdate {
public static final String CN_CREATE_USER_NO = "CREATE_USER_NO";
public static final String CN_CREATED_AT = "CREATED_AT";
public static final String CN_UPDATE_USER_NO = "UPDATE_USER_NO";
public static final String CN_UPDATED_AT = "UPDATED_AT";
public static final String DB_CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
/**
* λ±λ‘ νμλ²νΈ
*/
@Column(name = CN_CREATE_USER_NO, nullable = false, updatable = false)
private final Long createUserNo;
/**
* λ±λ‘μΌμ
*/
@ColumnDefault(DB_CURRENT_TIMESTAMP)
@Generated(GenerationTime.INSERT)
@Temporal(TemporalType.TIMESTAMP)
@Column(name = CN_CREATED_AT, nullable = false, insertable = false, updatable = false)
private final Date createdAt;
/**
* μμ νμλ²νΈ
*/
@Column(name = CN_UPDATE_USER_NO, insertable = false)
private Long updateUserNo;
/**
* μμ μΌμ
*/
@Temporal(TemporalType.TIMESTAMP)
@Column(name = CN_UPDATED_AT, insertable = false)
private Date updatedAt;
protected CreateAndUpdate() {
this.createUserNo = null;
this.createdAt = null;
}
private CreateAndUpdate(Long createUserNo) {
this.createUserNo = createUserNo;
this.createdAt = null;
this.updateUserNo = null;
this.updatedAt = null;
}
public static CreateAndUpdate create(@NonNull Long createUserNo) {
return new CreateAndUpdate(createUserNo);
}
public void update(@NonNull Long updateUserNo) {
this.updateUserNo = updateUserNo;
this.updatedAt = new Date();
}
public void checkPreInsert() {
if (createUserNo == null) {
throw new IllegalStateException("'createUserNo' not exist when create");
}
}
public void checkPreUpdate() {
if (createUserNo == null) {
throw new IllegalStateException("'createUserNo' not exist when update");
}
if (updateUserNo == null) {
throw new IllegalStateException("'updateUserNo' not exist when update");
}
}
}
Register
, Modify
- λ±λ‘κ³Ό μμ μ 보과 λΆλ¦¬λ ννμ κ°κ°μ²΄
Storeable
public interface Storeable {
String getMemberId();
ZonedDateTime getTs();
}
Register
@Value
@Embeddable
@AllArgsConstructor
public class Register implements Storeable, Serializable {
private static final long serialVersionUID = 6901279822511498217L;
@Column(name = "register_member_id", length = 100, nullable = false, updatable = false)
private final String memberId;
@Generated(GenerationTime.INSERT)
@ColumnDefault(DB_CURRENT_TIMESTAMP)
@Column(name = "register_ts", nullable = false, insertable = false, updatable = false)
private final ZonedDateTime ts;
// for JPA
protected Register() {
this.memberId = null;
this.ts = null;
}
public static Register create(String registerMemberId) {
if (StringUtils.isBlank(registerMemberId)) {
throw new IllegalArgumentException("'registerMemberId' is blank");
}
return new Register(registerMemberId, ZonedDateTime.now());
}
public boolean isEmpty() {
return memberId == null && ts == null;
}
}
Modify
@Value
@Embeddable
@AllArgsConstructor
public class Modify implements Storeable, Serializable {
public static final String DB_CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
private static final long serialVersionUID = -1206032844696773181L;
@Column(name = "modify_member_id", length = 100, nullable = false)
private String memberId;
// @Generated(GenerationTime.INSERT) // μ΄ λΆλΆμ κ³ λ―Ό μ€
@ColumnDefault(DB_CURRENT_TIMESTAMP)
@Column(name = "modify_ts", insertable = false, nullable = false)
private ZonedDateTime ts;
// for JPA
protected Modify() {
this.memberId = null;
this.ts = null;
}
public static Modify create(String modifyMemberId) {
if (StringUtils.isBlank(modifyMemberId)) {
throw new IllegalArgumentException("'modifyMemberId' is blank");
}
return new Modify(modifyMemberId, ZonedDateTime.now());
}
}