2014-02-20 2 views
0

JPA로 기존 데이터베이스 테이블을 사용하여 작업해야합니다. 테이블은 복합 기본 키를 사용합니다. 외부 키 속성은 테이블의 기본 키와 겹칩니다.JPA 복합 PK/PK/FK 오버랩을 가진 @OneToMany

단순화 된 예는, 각각의 '주문'이 많은 'OrderItems에'나는 다음과 같은 엔티티 및 ID-클래스 생성

Table Order     Table OrderItem 
-------------------   ---------------------- 
businessDomain (PK)   businessDomain (PK/FK) 
orderId  (PK)   oItemId  (PK) 
field1      orderId  (FK) 
field2 ...     description ... 

:

// ============== Order Entity ====================== 
@Entity 
@IdClass(OrderId.class) 
public class Order implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long orderId; 

    private String field1; 
    private String field2; 

    //Getters/Setters 
} 

// ============== OrderItem Entity ================== 
@Entity 
@IdClass(OrderItemId.class) 
public class OrderItem implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long oItemId; 

    private String description; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="orderId", referencedColumnName="orderId", insertable=false, updatable=false) 
    private Order order; 
    //Getters/Setters 
} 

// ============== OrderId class ===================== 
public class OrderId implements Serializable { 

    private long busindessDomain; 
    private long orderId; 

    //Getters/Setters 
} 

// ============== OrderItemId class ================= 
public class OrderId implements Serializable { 

    private long busindessDomain; 
    private long oItemId; 

    //Getters/Setters 
} 

을하지만 그건 '작업 아무튼. 그렇다면 orderItem에서 겹침 및 복합 키와 관련하여 순서를 올바르게 매핑하려면 어떻게해야합니까?

도움 주셔서 감사합니다. 다니엘


편집 :

좋아, 여기에 작동하는 것 같다 다른 시도이다. 추가 테스트가 필요합니다.

// ============== Order Entity ====================== 
@Entity 
@IdClass(OrderId.class) 
public class Order implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long orderId; 

    private String field1; 
    private String field2; 

    @OneToMany(targetEntity=OrderItem.class, mappedBy="order") 
    private List<OrderItem> orderItems; 

    //Getters/Setters 
} 

// ============== OrderItem Entity ================== 
@Entity 
@IdClass(OrderItemId.class) 
public class OrderItem implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long oItemId; 

    private String description; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumns({ 
     @JoinColumn(name="businessDomain", referencedColumnName="businessDomain"), 
     @JoinColumn(name="orderId", referencedColumnName="orderId") 
    }) 
    private Order order; 

    //Getters/Setters 
} 

답변

0

귀하의 foiegn 키는 busindessDomain하지 OrderId입니다. 이거해볼 수 있니?

@Entity  
    public class Order { 



    @EmbeddedId 
    private OrderPk orderId; 

    //getter/setter... 

    @Embeddable 
    private static class OrderPk { 
     private long busindessDomain; 
     private long oItemId; 
    }  
    } 

OrderItem에 :

@Entity  
    public class OrderItem{ 



    @EmbeddedId 
    private OrderItemPk orderTemId; 

    @ManyToOne 
    @JoinColumns(value = { @JoinColumn(referencedColumnName = "businessDomain", name="businessDomain")}) 
    private Order order; 


    getter/setter... 

    @Embeddable 
    private static class OrderItemPk{ 
     private long busindessDomain; 
     private long oItemId; 
    }  
    } 
+0

나는 모두 businessDomain 및 ORDERID는 주문에 참조 할 필요가 있다고 생각합니다. businessDomain 만 있으면 각 orderItem에 대해 수백만 개의 주문을 받게됩니다. – reindan

+0

죄송합니다. orderId는 또한 내가 그 관계를 잘못 이해할 것을 요구합니다. orderId를 referencecolumn으로 추가하면됩니다. – Rohit