시그마 삽질==six 시그마

JPA -값 타입 본문

프로그래밍/JPA

JPA -값 타입

Ethan Matthew Hunt 2020. 4. 9. 22:10
우아한 형제들의 김영한 팀장님의  '자바 ORM 표준 JPA 프로그래밍'을

구입하시길 강력 추천드립니다.

책 구입을 원하시는분은 요기를 클릭하시면 됩니다.

저자 직강 인프런 강의도 있습니다 궁금하신분은 요기를 클릭

하단의 내용은 제가 예전에 읽었던 내용을 요약 정리한 것입니다.

 

 

1. 엔티티 타입

 

식별자 있음

생명주기 있음

공유가능

 

2. 값타입

식별자x

공유 안하는게 safe

 

1) 기본 값타입 (자바기본타입, 래퍼클래스)

 

2) 임베디드 타입(복합 값 타입)

 

-@Embedded 필드, @Embeddable클래스 ,기본생성자 필수,composition 관계임(재사용 가능)

-잘설계한 ORM 테이블 수 보다 클래스 수가 더 많다

-임베디드 타입은 값타입포함하거나 Entity 참조가능

-임베디드 타입에 정의한 매핑정보를 재정의하려면 @AttributeOverride를 사용하면됨

-객체의 공유참조는 문제가 된다. 객체의 참조값을 공유하고 한곳을 변경하면 다른곳도 변경됨. 그래서 객체는 clone을 통해 값을 복사해쓰자 더욱 중요한것은 객체의 공유참조를 피하기 위해서는 생성자로만 값을 설정하고 수정자(setter)만들지 말아야함

 

 

@Entity
public class Member{

  @Id
  @GeneratedValue
	private Long id;

  @Embedded Address address;  //집주소
  .....

}


@Embeddable
public class Address{

  @Column(name="city")
  private String city;
  
  @Embedded
  private String zipcode;

}


@Embeddable
public class Zipcode{
  private String firstZip;
  private String secondZip;

}

 

 

 

AttributeOverride:속성 재정의

임베디드 타입에 정의한 매핑정보를 재정의하려면 엔티티에 @AttributeOverride를 사용

 

@Entity
public class Member{

  @Id
  @GeneratedValue
  private Long id;
    
  @Embedded Address houseAddress;  //집주소  <----
  @Embedded Address workAddress;  //직장주소 <-----위와 컬럼명 중복됨. 사용불가
  .....
}


@Entity
public class Member{

  @Id
  @GeneratedValue
  private Long id;
    
  @Embedded Address houseAddress;  //집주소  
  
  @Embedded 
  @AttributeOverrides
  ({ @AttributeOverride(name="city", colume=@colume(name="work_city"))
  	,@AttributeOverride(name="zipcode", colume=@colume(name="work_zipcode"))
  })
  Address workAddress;  

.....

}



CREATE TABLE MEMBER(
	CITY varchar(255),
	ZIPCODE varchar(255),
	WORK_CITY varchar(255),
	WORK_ZIPCODE varchar(255),

...
)

 

 

 

 

 

 

3) 컬렉션 값 타입

 

-값 타입 하나이상 저장하려 할시 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면됨

-값타입 컬렉션은 영속성 전이(Cascacde)+고아객체제거 기능(Orphan remove)을 필수로 가짐

-값타입 컬렉션의 조회전략은 기본이 LAZY다

-엔티티는 식별자가 있으므로 엔티티 값 변경해도 식별자로 찾아서 변경하나, 값타입은 식별자 개념이 없고 단순 값들의 모음이라 값을 변경해버리면 DB에 저장된 원본 데이터 찾기 힘들다. 그런문제로 인해 값 타입 컬렉션에 변경사항 발생시 값 타입 컬렉션이 매핑된 테이블의 연관된 모든 데이터를 삭제하고 현재 값 타입 컬렉션 객체에 있는 모든 값을 DB에 넣는다. 

- 따라서 실무에서는 값 타입 컬렉션 이 매핑된 테이블에 데이터가 많다면 값 타입 컬렉션 대신에 일대 다 관계를 고려해야한다.

@Entity
public class Member{

  @Id
  @GeneratedValue
	private Long id;

  @Embedded Address houseAddress;  //집주소
  .....
  //기본값 타입 컬렉션
  @ElemnetCollection 
  @CollectionTable(name="FAVORITE_CARS",
  	joinColums=@JoinColumn(name="MEMBER_ID"))
  @Column(name="CAR_NAME")
  private Set<String> favoriteCars= new HashSet<String>();
  
  
  //임베디드 타입 컬렉션
  @ElemnetCollection
  @CollectionTable(name="ADDRESS",
  	joinColums=@JoinColumn(name="MEMBER_ID"))
  @Column(name="CAR_NAME")
  private List<Address> addressHisotry= new ArrayList<Address>();
  

  
}


@Embeddable
public class Address{

  @Column(name="city")
  private String city;
  private String zipcode;

}

 

값 타입 컬렉션 사용

Member member= new Member();

 

//임베디드 값 타입

member.setHouseAddress("서울",135-223");

 

//기본값 타입 컬렉션

member.getFavoriteCars().add("페라리");

member.getFavoriteCars().add("람보르기니");

member.getFavoriteCars().add("미이바흐");

 

//임베디드 값 타입 컬렉션

meber.getAddressHistory().add(new Address("서울,133-435);

meber.getAddressHistory().add(new Address("인천,333-645);

 

em.persist(member);

 

 

 

 

 

값타입 컬렉션을 사용하는 대신에 새로운 에티티를 만들어서 일대다 관계로 설정할 수도 있음. 요기에 추가로 영속성전이(cascade)와 고아객체 제거(orphan remove)기능을 적용하면 값타입 컬렉션처럼 사용가능

 

 

@Entity
public class Member{

  	@Id
 	@GeneratedValue
	private Long id;
    
  	//임베디드 타입 컬렉션
	@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
	@JoinColumn(name="MEMBER_ID")
	private List<AddressEntity> addressHisotry= new ArrayList<AddressEntity>();
  
}


@Entity
public class AddressEntity{

  @Id
  @GeneratedValue
  private Long id;
  
   @Embedded Address address;  //집주소
...
}

 


  ...

'프로그래밍 > JPA' 카테고리의 다른 글

스프링 데이터 JPA  (0) 2020.04.10
JPA -객체 지향 쿼리언어  (0) 2020.04.09
JPA -프록시와 연관관계 관리  (0) 2020.04.09
JPA -고급 매핑  (0) 2020.04.09
JPA -다양한 연관관계 매핑  (0) 2020.04.09
Comments