2011-08-10 3 views
13

Hibernate hbm.xml 파일의 일부 클래스를 JPA 주석으로 마이그레이션하고 있습니다.Hibernate/JPA에서 대소 문자를 구분하여 @Embedded 속성의 필드 제외

우리는 몇 군데에서 사용되는 임베디드 클래스 Address을 보유하고 있습니다. 각 장소는 주소의 다른 하위 집합을 사용합니다.

(간결함을 위해 생략 게터/세터)이 고안 한 예에서,이 shippingAddress Address.country 사용하지만 billingAddress하지 않는 것을

@Embeddable 
public class Address { 
    String email; 
    String address; 
    String city; 
    String state; 
    String zip; 
    String country; 
} 

@Entity 
@Table(name="customer") 
public class Customer { 
    @Embedded 
    @AttributeOverrides({ 
    @AttributeOverride(name="address", [email protected](name="ship_addr"), 
    @AttributeOverride(name="city", [email protected](name="ship_city"), 
    @AttributeOverride(name="state", [email protected](name="ship_state"), 
    @AttributeOverride(name="zip", [email protected](name="ship_zip"), 
    @AttributeOverride(name="country", [email protected](name="ship_country") 
    }) 
    Address shippingAddress; 

    @Embedded 
    @AttributeOverrides({ 
    @AttributeOverride(name="address", [email protected](name="bill_addr"), 
    @AttributeOverride(name="city", [email protected](name="bill_city"), 
    @AttributeOverride(name="state", [email protected](name="bill_state"), 
    @AttributeOverride(name="zip", [email protected](name="bill_zip") 
    }) 
    Address billingAddress; 
} 

참고; 둘 다 Address.email을 사용하지 않습니다.

Hibernate가 명시 적으로 제공하지 않은 모든 열에 대해 @Column 태그를 유추하는 것이 문제입니다.

모든 Address 필드에 @Transient을 추가했지만, @AttributeOverride@Transient을 우회한 것으로 보입니다.

해결 방법이 있습니까?

답변

6

주석을 사용하여 포함 된 개체의 주소 필드를 "무시"할 수 있다고 생각하지 않습니다.

해결 방법은 이메일이없는 기본 유형의 주소와 필드 전자 메일의 ExtendedAddress (주소의 하위 클래스)를 만드는 것입니다.

+0

문제는 이것이 우리 조직 전체에서 사용되는 일반적인 모델 클래스라는 것입니다. 이 클래스를 동작을 변경하지 않고 JPA로 마이그레이션하거나 30 개의 다른 팀이 코드를 조정하도록 강요하는 방법을 찾고 있습니다. – qualidafial

+0

&at; 칼럼을 사용하는 것이 아니라 &at; Transient를 사용하는 JPA의 탈퇴 전환과 관련된 문제입니다. 이 아이디어는 어디서나 &at; 열 주석을 요구하지 않음으로써 JPA를 덜 침략 적으로 채택하는 것이 었습니다. 이는 우리를 물들게하고이 하나의 클래스를 기존 XML 구성에서 JPA 주석으로 마이그레이션하는 것을 불가능하게 만드는 부작용입니다. – qualidafial

+0

모델을 변경할 수없는 경우 해결책이 표시되지 않습니다. 사용되지 않는 Address 속성을 무시하고 DB에 공백으로두면됩니다. 더러운 솔루션,하지만 최소한 침략. –

6

제 조언은 PartialAddress/NationalAddress/BillingAddress라는 새 엔터티를 만드는 것입니다. 이것은 단지 JPA 매핑에 사용하고, 고객 인터페이스에 노출되지 않는 것 :

private PartialAddress billingAddress; 

public Address getBillingAddress() { 
    return billingAddress.toAddress(); 
} 

그렇지 않으면,이 문제에 대한 다소 추한 해결 방법으로 올라와있다, 어쩌면 그것은뿐만 아니라 당신을 위해 작동합니다.

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="address", [email protected](name="bill_addr"), 
    @AttributeOverride(name="city", [email protected](name="bill_city"), 
    @AttributeOverride(name="state", [email protected](name="bill_state"), 
    @AttributeOverride(name="zip", [email protected](name="bill_zip"), 
    @AttributeOverride(name="country", [email protected](name="bill_id + null"), 
}) 
Address billingAddress; 

내가 오라클은 EclipseLink를 사용하고,뿐만 아니라 최대 절전 모드 3.6에서 작동 : 대신 실제 컬럼에 필드를 매핑, 나는 SQL 널 (null) 상수를 반환합니다. 그리고 읽기 전용 객체에서만 테스트했습니다. 이론적으로는 insertableupdatable 속성을 false로 설정하면 충분합니다.

+2

이것은 매우 훌륭하고 혁신적인 해결 방법입니다. 무시 된 속성을 null로 직접 매핑합니다. (즉,'column = @ Column (name = "null")' –

+0

@KenChan의 해결 방법은 데이터를 지속하는 데는 적합하지만 데이터베이스에서 읽을 때 문제가 있습니다. "javax.persistence.PersistenceException : org.hibernate.exception.SQLGrammarException : ResultSet을 추출 할 수 없습니다"라는 메시지가 표시됩니다. "ohejsSqlExceptionHelper - ERROR : column not found tabl0_.null" –

관련 문제