문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
java:jpa:converter [2018/07/11 14:43] kwon37xi |
java:jpa:converter [2022/11/18 15:05] (현재) kwon37xi [변환 클래스에 equals & hashCode 구현 필수] |
||
|---|---|---|---|
| 줄 3: | 줄 3: | ||
| * [[java: | * [[java: | ||
| * [[http:// | * [[http:// | ||
| + | * '' | ||
| <code java> | <code java> | ||
| @Converter | @Converter | ||
| - | public class PersonNameConverter implements | + | public class PersonNameConverter implements AttributeConverter< |
| - | | + | |
| - | + | ||
| - | private static final String SEPARATOR = ", "; | + | |
| @Override | @Override | ||
| public String convertToDatabaseColumn(PersonName personName) { | public String convertToDatabaseColumn(PersonName personName) { | ||
| - | | + | |
| - | return null; | + | |
| - | } | + | |
| - | + | ||
| - | StringBuilder sb = new StringBuilder(); | + | |
| - | if (personName.getSurname() != null && !personName.getSurname() | + | |
| - | .isEmpty()) { | + | |
| - | sb.append(personName.getSurname()); | + | |
| - | sb.append(SEPARATOR); | + | |
| - | } | + | |
| - | + | ||
| - | if (personName.getName() != null | + | |
| - | && !personName.getName().isEmpty()) { | + | |
| - | sb.append(personName.getName()); | + | |
| - | } | + | |
| - | + | ||
| - | return sb.toString(); | + | |
| } | } | ||
| @Override | @Override | ||
| public PersonName convertToEntityAttribute(String dbPersonName) { | public PersonName convertToEntityAttribute(String dbPersonName) { | ||
| - | if (dbPersonName == null || dbPersonName.isEmpty()) { | + | // DB column to object 구현 |
| - | return null; | + | |
| - | } | + | |
| - | + | ||
| - | String[] pieces = dbPersonName.split(SEPARATOR); | + | |
| - | + | ||
| - | if (pieces == null || pieces.length == 0) { | + | |
| - | return null; | + | |
| - | } | + | |
| - | + | ||
| - | PersonName personName = new PersonName(); | + | |
| - | String firstPiece = !pieces[0].isEmpty() ? pieces[0] : null; | + | |
| - | if (dbPersonName.contains(SEPARATOR)) { | + | |
| - | personName.setSurname(firstPiece); | + | |
| - | + | ||
| - | if (pieces.length >= 2 && pieces[1] != null | + | |
| - | && !pieces[1].isEmpty()) { | + | |
| - | personName.setName(pieces[1]); | + | |
| - | } | + | |
| - | } else { | + | |
| - | personName.setName(firstPiece); | + | |
| - | } | + | |
| - | + | ||
| - | return personName; | + | |
| - | } | + | |
| } | } | ||
| 줄 70: | 줄 27: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | ===== 변환 클래스에 equals & hashCode 구현 필수 ===== | ||
| + | |||
| + | * '' | ||
| + | * [[java: | ||
| + | * 이때 첫 값과 두번째 값의 '' | ||
| + | * 따라서 Java 기본형들이 아닌 custom class 로 convert 할 경우에는 필히 '' | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | ===== 잘못된 Colum Type 매핑 ===== | ||
| + | * AttributeConverter 를 사용하여 String, Number 같은 다소 광의의 타입을 명시적 비즈니스 도메인 타입으로 매핑했을 때(예: ISBN), 보통 해당 타입이 '' | ||
| + | * 이때 [[https:// | ||
| + | |||
| + | <code java> | ||
| + | @Convert(converter=ISBNConverter.class) | ||
| + | @org.hibernate.annotations.Type(type=" | ||
| + | private ISBN isbn; | ||
| + | </ | ||
| + | |||