- Java는 Lombok을 사용한다고 가정
- Entity는 반드시
javax.persistence.Entity
어노테이션이 붙어야 한다. - Entity는 반드시
public
또는protected
의 NoArg-Constructor를 가져야 한다. 다른 추가 생성자도 가질 수 있다.kotlin에서는 kotlin.jpa plugin을 사용하게 되는데 이 plugin이 생성한 기본 생성자는 public이지만 reflection으로만 접근이 가능하고, 자바나 코틀린 코드에서는 접근이 불가능하다.
- Entity는 반드시 top-level 클래스여야 한다.
- enum 또는 interface는 Entity가 될 수 없다.
- Entity는 final 클래스일 수 없고, 모든 메소드와 Entity 내에 persist 되는 변수들 또한 final로 지정할 수 없다.
JPA는 runtime에 Entity의 프록시 객체를 만들어 Lazy-Loading 기능을 할 수 있기 때문에 final로 선언하는 것이 대부분 금지되어 있다. kotlin 에서는 kotlin.allopen plugin으로 해결할 수 있다.
- Entity 클래스가 detached 상태로 사용되려면 Serializable 인터페이스를 구현해야 한다.
- 추상 클래스 또는 구현 클래스 모두 Entity가 될 수 있다.
@Getter
@ToString
@Entity
@Table(name = "display_msg")
public class DisplayMsg {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "display_msg_id", nullable = false)
private Long displayMsgId;
@Column(name = "display_msg", nullable = false)
private String displayMsg;
@Column(name = "disp_start_time", nullable = false)
private LocalTime dispStartTime;
@Column(name = "disp_end_time", nullable = false)
private LocalTime dispEndTime;
}
@Entity
@Table(name = "display_msg")
class DisplayMsg(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "display_msg_id", nullable = false)
val displayMsgId: Long,
@Column(name = "display_msg", nullable = false)
val displayMsg: String,
@Column(name = "disp_start_time", nullable = false)
val dispStartTime: LocalTime,
@Column(name = "disp_end_time", nullable = false)
val dispEndTime: LocalTime
)
@Getter
@ToString
@Entity
@Table(name = "emoji")
public class Emoji {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "emoji_id", nullable = false)
private Long emojiId;
@Column(name = "img_url", nullable = true)
private String imgUrl;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "score", nullable = false)
private int score;
@Column(name = "rgb_value", nullable = false)
private String rgbValue;
@Column(name = "emoji_type", nullable = false)
private String emojiType;
}
@Entity
@Table(name = "emoji")
class Emoji(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "emoji_id", nullable = false)
val emojiId: Long,
@Column(name = "img_url", nullable = true)
val imgUrl: String?,
@Column(name = "title", nullable = false)
val title: String,
@Column(name = "score", nullable = false)
val score: Int,
@Column(name = "rgb_value", nullable = false)
val rgbValue: String,
@Column(name = "emoji_type", nullable = false)
val emojiType: String
)
public class com/hardy/practice/domain/emoji/Emoji {
@Ljavax/persistence/Entity;()
@Ljavax/persistence/Table;(name="emoji")
// access flags 0x12
private final J emojiId
@Ljavax/persistence/Id;()
@Ljavax/persistence/GeneratedValue;(strategy=Ljavax/persistence/GenerationType;.IDENTITY)
@Ljavax/persistence/Column;(name="emoji_id", nullable=false)
// access flags 0x1
public getEmojiId()J
L0
LINENUMBER 17 L0
ALOAD 0
GETFIELD com/hardy/practice/domain/emoji/Emoji.emojiId : J
LRETURN
L1
LOCALVARIABLE this Lcom/hardy/practice/domain/emoji/Emoji; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1
// access flags 0x12
private final Ljava/lang/String; imgUrl
@Ljavax/persistence/Column;(name="img_url", nullable=true)
@Lorg/jetbrains/annotations/Nullable;() // invisible
// access flags 0x1
public getImgUrl()Ljava/lang/String;
@Lorg/jetbrains/annotations/Nullable;() // invisible
L0
LINENUMBER 20 L0
ALOAD 0
GETFIELD com/hardy/practice/domain/emoji/Emoji.imgUrl : Ljava/lang/String;
ARETURN
L1
LOCALVARIABLE this Lcom/hardy/practice/domain/emoji/Emoji; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
...