package roomescape.common.entity import jakarta.persistence.* import org.springframework.data.annotation.CreatedBy import org.springframework.data.annotation.CreatedDate import org.springframework.data.annotation.LastModifiedBy import org.springframework.data.annotation.LastModifiedDate import org.springframework.data.domain.Persistable import org.springframework.data.jpa.domain.support.AuditingEntityListener import java.time.LocalDateTime import kotlin.jvm.Transient @MappedSuperclass @EntityListeners(AuditingEntityListener::class) abstract class AuditingBaseEntity( id: Long, ) : BaseEntityV2(id) { @Column(updatable = false) @CreatedDate lateinit var createdAt: LocalDateTime @Column(updatable = false) @CreatedBy var createdBy: Long = 0L @Column @LastModifiedDate lateinit var updatedAt: LocalDateTime @Column @LastModifiedBy var updatedBy: Long = 0L } @MappedSuperclass abstract class BaseEntityV2( @Id @Column(name = "id") private val _id: Long, @Transient private var isNewEntity: Boolean = true ) : Persistable { @PostLoad @PrePersist fun markNotNew() { isNewEntity = false } override fun getId(): Long = _id override fun isNew(): Boolean = isNewEntity }