2011-07-05 2 views
2

이 질문은 JPA를 사용하여 일부 시나리오가 전체 개체 모델의 이점을 누리고 일부 모델은 훨씬 편한 모델로 더 잘 구현되는 것처럼 보이는 데이터를 관리하는 데 관심이 있습니다. 따라서 두 가지 모델을 만들려고합니다. 나는 이것이 좋은 생각이 아니라는 느낌을 갖지만, 나는 왜 대안이 무엇인지, 또는 대안이 무엇인지 정확히 알기가 어렵다.JPA, pattern 또는 anti-pattern : 매핑의 플랫 및 관련 세트 모두를 갖고 있습니까?

기본 시나리오는 엔티티가 있으며 엔티티 B와의 관계의 많은면을 호출 할 수 있습니다. 따라서 데이터베이스 A에는 외래 키 필드가 있으며 우리가 볼 수있는 전체 개체 모델 (단순화, getters/setters removed)

public Class A { 
     public int aKey; 
     public B; 
     // more attributes 
    } 

    public Class B { 
     public int bKey; 
     public List<A> collectionOfA; 
     // and more 
    } 

하나의 특정 시나리오는 새로운 As 시스템에 도착하는 것을 처리하는 것입니다. 그들은 텍스트 파일의 형태로 외부에서 왔습니다. 삽입 코드는 찾을 수 있도록 설정/페어링이 여러 번 반복되고, 이러한 여러 관계가있다, 내 시나리오는 더 복잡 사실 지금

for each CVS record 
     get the bKey from the record 
     find the B, or manage any error 
     create the A, setting the B 
     persist 

할 필요가있다.

는 또한 내가 (사실이)
public Class Ainserter { 
     public int aKey; 
     public int bKey; 
     // more attributes 
    } 

지금 난 그냥 두 값을 설정하고 지속은 A 테이블에 대한 두 번째 매핑을 만들 수 있습니다. 이것은 DB에 참조 무결성 제약 조건이 있다고 가정하지만 사용중인 도구를 사용하는 경우입니다. 이 시스템과 많은 레거시 시스템에서 DB가 미리 존재하며 새로운 JPA 코드와 기타 Java 코드가 아닌 다른 코드에서 액세스 할 수 있습니다. 따라서 간단한 경우 JPA 코드에 참조 무결성 검사를 적용 할 이유가 없습니다.

전체 모델의 측면이 내 삽입과 관련하여 부적절하게 될 가능성이 있음을 알 수 있습니다. 그러나 레거시 환경에서는 언제든지 DB 자체에서 삽입이 발생할 수 있습니다. 그래서 나는 여기서 새로운 문제를 보지 못한다.

동일한 Entity Context가 두 모델 모두에 사용되었지만 적절한 캡슐화로 피할 수있는 경우 혼란을 일으킬 수도 있습니다.

다른 의견은 있습니까?

편집 : B 인스턴스를 얻을 수 EntityManager.getReference (B.class, B 키)를 사용하는 axtavt에서 제안이 있습니다

. 내 이해는 JPA 프로그래밍 모델을 제대로 준수하기 위해이 작업을 수행 할 경우 관계의 양측을 설정해야하기 때문에 "참조 된"B 개체를 방문하고 A를 자신의 컬렉션에 추가해야 할 것입니다. 다시

편집 : 나는이 승리를 얻을 수 없겠죠 성능 측면에서, 그래서

나는 B를 방문하는 데이터베이스 조회를 일으킬 것이라고 우려했다. 적어도 OpenJPA는 B의 키와 As의 컬렉션에만 액세스한다면 B를 "팽창"시킬 필요가 없다는 것을 아주 좋은 권한으로 가지고 있습니다. 따라서 getReference()가 좋은 제안입니다. 나는 잘 설계된 JPA 구현이 그러한 최적화를하는 것이 타당한 것처럼 보인다.

답변

3

JPA는 기본적으로 사용자가 설명하는 방법을 결합한 EntityManager.getReference() 방법을 사용합니다.

데이터베이스를 손상시키지 않고 기본 키를 가져와 해당 기본 키가있는 프록시 개체를 반환합니다.따라서 두 번째 접근 방식에서 원하는대로 해당 객체를 사용하여 관계 필드를 초기화 할 수 있습니다.

+0

감사합니다. db 액세스가 감소했는지 여부는 확실하지 않지만 질문에 대한 편집은 내 당황을 설명합니다. – djna

+0

편집 된 질문을 왜 내가 지금 흩어져있어, 따라서 getReference() 전략을 믿는 지 말하십시오. @axtavt : 감사합니다. – djna

관련 문제