2016-09-09 5 views
0

더 나은 코드 구조와 재사용을 위해 일부 JPA Entity 내에서 @Embeddable Bean을 사용하고 있습니다. 내가 궁금해하는 것은 : 내가 만난 모든 예제는 @Embedded 객체를위한 setter와 getter를 제공한다는 것이다. 왜? 필자는 최종 필드로 사용하려고 노력했습니다. 즉, 작동하며, 우리의 경우에는 의미가 있습니다. 삽입 된 내용이 항상 존재하기 때문입니다. 거기에 내가 알지 못하는 몇 가지 단점이 있습니까?최종 특성으로 @Embedded beans?

예를 들어

는 :

@Embeddable 
public class Address { 
    // ... 
} 

@Entity 
public class Person { 
    @Embedded 
    private Address address; 

    public void setAddress(Address address) { 
     this.address = address; 
    } 

    public Address getAddress() { 
     return address; 
    } 
} 

나는이 방법을 Person 쓰기 어떤 문제가 항상 Address있을 때, 거기 :

@Entity 
public class Person { 
    @Embedded 
    private final Address address = new Address(); 

    public Address getAddress() { 
     return address; 
    } 
} 
+0

이 밝혀 동안 일을 최종 제작하는 것으로, 적어도, 불쾌한 (@NeilStockton http://stackoverflow.com/a/39416643/21499의 답을 비교) JPA가 임베드 콩을 설정하는 양상도 있습니다 모든 필드가 null의 경우는 null가된다. http://stackoverflow.com/q/1324266/21499. 그래서 setter를 제거하고 Person.address를 getter에 생성하면 null이된다. –

답변

2

당신은 을 지속 할 수없는 보통 그런 식으로 이루어집니다 final 또는 static 필드가 포함되거나 포함되지 않은 경우 적용됩니다. JPA 스펙은 다른 JPA 제공 업체의 문서와 마찬가지로 매우 명확합니다.

JPA 사양에게 $ 2.1

엔티티 클래스는 최종이 아니어야합니다. 엔티티 클래스의 메소드 또는 영구 인스턴스 변수는 final이 될 수 없습니다.

+0

고마워요! 당연히, 어쨌든 작동합니다. 나는 Hibernate 5를 시도했다. 아마 여기는 실제로 적용되지 않는다. 결국 Person.address는 지속 된 인스턴스 변수로 간주 될 수도 있고 그렇지 않을 수도 있습니다. Person.address 자체가 아니라 실제로 여기에 유지되는 속성 일뿐입니다. 그렇습니까? –

+1

FIELD는 JPA 제공자에 의해 설정되거나 포함되지 않아야합니다. 여기에 적용됩니다. 그게 이식성이라고 할 수있는 전부입니다. –

+0

좋아, 나는 너를 믿는다. :-) 나는 Hibernate가 이것을 처리 할 때 어떤 일이 일어나는지를 확인했다. 그리고 실제로 최종 필드 Person.address를 "final"에 의한 보호를 무시하고 새로운 객체로 변경하는 것 같다. 이것은 작동하지만 매우 불쾌하고 익숙한 것으로 들립니다. 즉, 빈을로드 할 때 Person 인스 턴 스 테이션에 대해 Address가 두 번 인스턴스화됩니다. 하지만 언제 어디서 주소를 인스턴스화 할 지 확신 할 수 없습니다. –