임베디드 타입은 객체안에 타입을 묶어서 보여주는 구조체라고 생각하면 편할 것 같다.
city street zipcode 를 Address 라는 임베디드 타입으로 묶었고 그것을 Member.java에서 사용한 것이다.
하지만 위와 같이 Address 타입이 2개면 컬럼명이 겹치니 문제가 생길 것이다.
이를 위해 AttributeOverride를 통해 바꿔줄 수 있다.
그리고 실행시켜주면 바뀐 이름으로 나오고 오리지널 address 이름으로 나온 것을 확인할 수가 있다.
member.java의 임베디드 타입 위에는 @Embedded
그 타입에는 @Embeddable를 사용한 것을 확인가능하다.
임베디드 타입은
해당 값 타입만 사용할 수 있는 의미 있는 메서드를 생성할 수 있다.
재사용성이 높고 응집도가 높다.
사용한다고 해서 테이블 매핑이 바뀌는 것은 아니다.
임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null이 된다.
다음과 같이 Address를 member1과 member2에 둘 다 넣고 그 값을 변경하면 두 값 다 변경된다.
다음과 같이 말이다.
아예 address를 새로 만들어서 집어 넣어주자. 불변객체를 위해 setter 자체를 생성안해주는 것이 속편하다.
그러면 다음과 같이 원하는대로 수행된다.
int 같은 것이 아닌 이 참조를 비교하기 위해 address.java 안에 equals 와 hashCode를 오버라이딩해주었다.
값 타입 컬렉션을 사용할 때에 db테이블에 넣는 시점에 문제가 생길 것이다.
그래서 @ElementCollection 을 쓰고 @CollectionTable 로 테이블을 하나 생성해준다. 조인되는 컬럼도 적어준다.
favoriteFoods 경우엔 String 하나 이므로 Column명을 따로 설정해줄 수가 있었다.
그리고 밑의 사진과 같이 get을 통해 가져와서 add 시켜주었다. address를 추가할때 new 를 통해 새로운 address를 넣어서 불변객체로 설정해주자.
다음과 같이 들어가게된다. address 테이블과 favorite_food 테이블이 생성된 것을 알 수 있으며 member_id를 가지고 있다.
그 이유는 @ElementCollection이 fetch=lazy를 default로 가지고 있기 때문이다.
삭제하고 싶을 때에는 그 index에 접근해서 remove 후에 add를 해야한다. favoriteFoods의 경우에는 생각하는대로 된다. 하지만 밑의 address의 경우에는 해당 address만 remove 하고 add를 해주는 것이 아니라, 그냥 list<address> 자체를 다 통채로 delete 처리를 하고 add와 remove 에 포함되지않는 것들을 다시 insert 해준다. 그래서 위의 경우엔 delete 1번 후, insert가 2번이 처리되게 된다. 그래서 이 경우엔 사용을 하면 안된다.
값 타입 컬렉션 대신 이것을 사용하기 위해서는 그냥 따로 entity 를 만들어서 OneToMany로 처리해주는 것이 좋다.
그리고 cascade(영속성 전이)와 orphan(고아 객체 제거) 처리로 값 타입 컬렉션과 같이 처리해준다.
값 타입 컬렉션은 정말 간단한 경우에만 사용해주도록 하자.
실습 pjt
address 를 임베디드 타입으로 묶어주었다.
equals 오버라이딩 할 때에 return 부분을 getter 를 이용해서 해주면 좋다. 프록시의 경우 getter가 없으면 찾을 수 없기 때문이라고 한다.
그리고 member 와 delivery에 적용해주었다.
실습 pjt end
다음과 같이 반환타입이 명확할 떄에는 TypedQuery를 사용하지만, m.username, m.age 와 같이 명확하지 않을 때에는 그냥 Query를 사용한다.
그리고 결과가 1개 일때에는 getSingleResult()를 사용하는데, 결과가 없으면 noresultexception, 둘 이상이면 notuniqueresultexception이 나오게된다. 그래서 잘 안쓰인다.
2개 이상일 때에는 getResultList()를 사용한다.
다음과 같이 파라미터 바인딩을 진행할 수가 있다.
select 절에 조회할 대상을 지정하는 것을 프로젝션이라고 한다.
종류로는 엔티티 프로젝션, 임베디드 타입 프로젝션, 스칼라 타입 프로젝션이 있다.
위와같이 그냥 query 타입과 object[] 타입으로 검색을 하는 방법이 있다.
또는 DTO파일을 따로 만들어서 new 명령어를 통해 수행할 수 있다. 패키지명과 클래스 명을 다 적어주어야 하며,
순서와 타입이 일치하는 생성자가 필요하다.
'공부 기록들' 카테고리의 다른 글
CPU 스케줄링 (0) | 2020.10.23 |
---|---|
앞으로 (0) | 2020.06.26 |
2020.06.18 JPA(4) (0) | 2020.06.18 |
2020.06.17 JPA(3) (0) | 2020.06.17 |
2020.06.16 JPA(2) (0) | 2020.06.17 |