2011-12-20 4 views
0

두 객체 Customer와 Transaction이 있습니다. 그들은 다음과 같이 보입니다.ManyToOne 매핑에 객체가 없으면 객체를로드하는 방법은 없습니다.

@Entity 
class Transaction { 
    @Id 
    long id;   

    @Column("CUSTOMER_ID") 
    long customerId; 

    @ManyToOne 
    @JoinColumn(name="CUSTOMER_ID", insertable=false, updatable=false, nullable=false) 
    Customer customer 
    ... 
} 

@Entity 
class Customer { 
    @ID 
    long id; 
    ... 
} 

우리는 가짜 고객 번호를 사용하여 일부 트랜잭션 유형을 식별합니다. 변화를 위해 아무 것도 할 수 없으며 통제 할 수없는 여러 가지 다른 프로세스가 의존하는 관행입니다.

내가 할 수 있기를 원하는 것은 가짜 고객 거래에 대한 고객 번호를 얻고 내 거래 개체에 null 고객이 있다는 것입니다. 더미 고객이 아닌 거래의 경우 고객 오브젝트를 설정해야합니다. 이상적으로는 가짜 고객 번호를 테스트하고 별도의 쿼리를 실행하지 않아도됩니다.

쿼리를 작성하고이를 수행하도록 내 개체를 매핑하려면 어떻게해야합니까? 지금 내가 시도한 모든 것, 거짓 정책 ID에 대한 EntityNotFound 예외로 끝납니다.

답변

0

UNION을 사용하면 올바른 고객 레코드를 선택할 수 있고 기본 'NO SUCH CUSTOMER'레코드와 결합하여 기본값을 반드시 주문하고 첫 번째 결과 만 가져 오는 것이 좋습니다.

0

ManyToOne이 아무것도 참조하지 않는 경우 JPA에서 null을 받아 들여야합니다. EntityNotFound를 얻는 방법을 잘 모르겠습니다. JPA 제공 업체에게 특정 문제 일 수 있습니다.

+0

최대 절전 모드를 사용하고 있습니다. 문제는 CUSTOMER_ID가 null 인 경우가 아니라 null이 아니지만 객체를 참조하지 않는 경우입니다. 우리는 해당 고객 객체가없는 특정 더미 고객 ID를 가지고 있습니다. 위에서 말했듯이, 불행하게도 다른 프로세스와 시스템이 의존하기 때문에 제거 할 수없는 유물입니다. – AndrewMcCall

+0

이 문제는 Hibernate가 프록시를 사용하여 지연로드를 구현하는 방식에만 해당되며, 프록시를 사용하지 않는 다른 JPA 구현에서는이 문제가 발생하지 않습니다. EAGER로 설정하면 문제가 해결됩니다. – James

+0

엔티티가 존재할 때 엔티티가로드되지 않는다는 것은 아닙니다. 문제는 엔티티가 존재하지 않을 때, 예외를 던진 더미 고객 중 하나 일 때입니다. – AndrewMcCall

관련 문제