티스토리 뷰
Entity 모델링에 VO(value object)를 활용하기
최근 진행하고 있는 Entry3.0 프로젝트에서 ged_grade(검정고시 졸업자 점수)테이블의 grade 컬럼을 unsigned double로 만들었다.
점수를 음수로 저장하는 몽총이는 없으니까 난 스마트하니까~
~
이 테이블을 엔티티로 매핑하려는데 unsigned에 대한 처리는 자바에서 기본적으로 제공하는 기능(문법?)으론 불가능했다. 자바에는 unsigned가 없기 때문이다. 무언가 다른 방법이 필요했다.
그래서 VO를 활용하기로 했다.
먼저 UnsignedDouble이라는 Double을 래핑한 VO를 만들고 @Embeddable
을 붙여 Entity에 임베딩할 수 있도록 했다.
이제 GedGrade Entity 클래스에서 UnsignedDouble을 가져다 써보자. (편의를 위해 @Column
을 통한 설정은 따로 하지 않았다.)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.entry.entrydsm.ged.grade.GedGrade column: value ....(중략)
@Embedded
는 컬럼 명으로 @Embeddable
클래스 내에서 설정한 이름을 사용하기 때문에 4개의 컬럼을 "value"라는 이름으로 매핑을 시도하게되고, 결국 Repeated column 오류가 발생하게 된다.
이 문제는 @AttributeOverride
를 이용해 컬럼명을 덮어 씌움(Override)으로써 해결할 수 있다.
적용후 오류없이 잘 동작함을 확인할 수 있다.
하지만 Response로서 GedGrade Entity를 던져주면 JSON Serializing 과정에서 UnsignedDouble이 객체로 판정되어 기대했던 JSON 형태와 다른 JSON으로 Serializing되는 이슈가 발생한다.
{ "userId": "user_id", "grade": { "value": 1.0 }, "conversionScore": { "value": 2.0 }, "attendanceScore": 100, "volunteerScore": { "value": 100.0 }, "finalScore": { "value": 100.0 } }
우리가 원한 건 이게 아닌데...
해결하는 방법은 JPA의 범주를 벗어나기 때문에 다른 게시글로 다뤄야겠다.
- Total
- Today
- Yesterday
- JPA 관계
- 전공프로젝트
- 자바 힙 구현
- 자료구조 Heap
- 붕어빵틀과 붕어빵
- 자료구조 힙
- 우아한테크캠프
- 알고리즘
- Java 스택 계산기
- 스택
- 클래스와 객체
- 백준 온라인 저지
- 소프트웨어개발과
- 백준
- uni direction
- @Embeddable
- bi direction
- 정렬 알고리즘
- Sign Me
- 자료구조
- Entity에 VO
- @Embdded
- 우테캠
- 양방향 연결
- Java Heap
- 스택 계산기
- 붕어빵틀과붕어빵
- 단방향 연결
- signme
- 정렬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |