2014-02-20 4 views
0

Мне нужно работать с существующими таблицами базы данных с JPA. В таблицах используются составные первичные ключи. Атрибуты внешнего ключа перекрываются с первичным ключом таблицы.JPA @OneToMany с составным PK-PK/FK перекрытием

упрощенный пример, каждый 'Order' имеет много '' ТоварыЗаказа

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

Я создал следующие Сущности и ID-классы:

// ============== 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 для заказа относительно перекрывающихся и составных клавиш?

Благодарим за помощь. Daniel


EDIT:

Хорошо, вот еще одна попытка, которая, кажется, работает. Требуется дальнейшее тестирование.

// ============== 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

Смежные вопросы