Skip to content

Latest commit

 

History

History
170 lines (137 loc) · 4.66 KB

1.Entity.md

File metadata and controls

170 lines (137 loc) · 4.66 KB

Entity

  • Java는 Lombok을 사용한다고 가정

Hibernate's Entity Requirement

  • 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가 될 수 있다.

DisplayMsg Class

Java

@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;
}

Kotlin

@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
)

Emoji Class

Java

@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;
}

Kotlin

@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
)

Kotlin ByteCode

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

    ...