PostIT

[spring/hibernate]Entity 선언시에 Column으로 쓰지않는 변수에 대한 선언. @Transient 본문

Spring/JPA(Hibernate)

[spring/hibernate]Entity 선언시에 Column으로 쓰지않는 변수에 대한 선언. @Transient

shun10114 2016. 11. 7. 18:02

http://egloos.zum.com/LuckyChips/v/1692422


@Transient(Java Persistence API)

http://LuckyChips.egloos.com/1692422

엔티티 클래스로 등록한 클래스지만, DB 테이블과는 별도로 기능이(추가 필드나 메소드) 필요한 경우가 있다.

예를 들어 DB 테이블에는 존재하지 않지만, 엔티티 클래스에는 등록되어 같이 운용하는 경우가 있다.

XML이나 JSON으로 클라이언트에 데이터를 전해주어야 할 경우, 모델을 이용하지 않으면 객체나 특정 콜렉션 타입을

리턴하게 된다.

특정 클래스의 객체를 리턴할 경우, XML이나 JSON은 클래스 내부에 존재하는 내용으로 문서를 구성한다. 하지만 클래스에는 존재하지 않지만, 서로 관련있는 내용끼리 묶어서 클라이언트에 전해두어야 할 필요가 있다.

이럴 경우, DB 테이블에 간섭하지 않고, 엔티티 클래스 내부에서만 동작하게 하는 어노테이션을 사용한다.

@Transient 어노테이션을 사용하는데, 이 어노테이션은 하이버네이트의 jpa 패키지에 위치하고 있다.

@Transient 어노테이션을 사용한 필드나 메소드는 DB 테이블에 적용되지 않는다.



* 두 개의 서비스 클래스의 메소드를 각각 호출해서 맵으로 만들어 클라이언트에 보내지 않고, 하나의 객체에 필드를 추가해서 거기에 필요한 나머지 정보들을 담아서 사용했다.

   1: import java.util.List;
   2:  
   3: import javax.persistence.Column;
   4: import javax.persistence.Embedded;
   5: import javax.persistence.Entity;
   6: import javax.persistence.GeneratedValue;
   7: import javax.persistence.Id;
   8: import javax.persistence.Transient;
   9:  
  10: import org.hibernate.search.annotations.Field;
  11: import org.hibernate.search.annotations.Indexed;
  12:  
  13: import com.google.gwt.user.client.rpc.IsSerializable;
  14:  
  15: @Entity
  16: @Indexed
  17: public class Application implements IsSerializable {
  18:     
  19:     @Id
  20:     @GeneratedValue
  21:     private long appId; 
  22:     
  23:     @Column(length = 200)
  24:     @Field
  25:     private String namespace;
  26:     
  27:     @Column(length = 100)
  28:     @Field
  29:     private String className;
  30:     
  31:     @Column(length = 100)
  32:     @Field
  33:     private String title;
  34:     
  35:     @Column(length = 10000)
  36:     @Field
  37:     private String explanation; 
  38:     
  39:     @Transient
  40:     private List<String> iconImgUrls;
  41:     
  42:     @Transient
  43:     private List<String> backgroundImgUrls;
  44:     
  45:     @Transient
  46:     private List<String> appFileUrls;
  47:     
  48:     public List<String> getBackgroundImgUrls() {
  49:         return backgroundImgUrls;
  50:     }
  51:  
  52:     public void setBackgroundImgUrls(List<String> backgroundImgUrls) {
  53:         this.backgroundImgUrls = backgroundImgUrls;
  54:     }
  55:  
  56:     public List<String> getAppFileUrls() {
  57:         return appFileUrls;
  58:     }
  59:  
  60:     public void setAppFileUrls(List<String> appFileUrls) {
  61:         this.appFileUrls = appFileUrls;
  62:     }
  63:  
  64:     public List<String> getIconImgUrls() {
  65:         return iconImgUrls;
  66:     }
  67:  
  68:     public void setIconImgUrls(List<String> iconImgUrls) {
  69:         this.iconImgUrls = iconImgUrls;
  70:     }
  71:  
  72:     public long getAppId() {
  73:         return appId;
  74:     }
  75:  
  76:     public void setAppId(long appId) {
  77:         this.appId = appId;
  78:     }
  79:  
  80:     public String getNamespace() {
  81:         return namespace;
  82:     }
  83:  
  84:     public void setNamespace(String namespace) {
  85:         this.namespace = namespace;
  86:     }
  87:  
  88:     public String getClassName() {
  89:         return className;
  90:     }
  91:  
  92:     public void setClassName(String className) {
  93:         this.className = className;
  94:     }
  95:  
  96:     public String getTitle() {
  97:         return title;
  98:     }
  99:  
 100:     public void setTitle(String title) {
 101:         this.title = title;
 102:     }
 103:  
 104:     public String getExplanation() {
 105:         return explanation;
 106:     }
 107:  
 108:     public void setExplanation(String explanation) {
 109:         this.explanation = explanation;
 110:     }
 111: }


Comments