简体   繁体   English

JPA @OneToMany具有复合PK-PK / FK重叠

[英]JPA @OneToMany with composite PK - PK/FK overlapping

I need to work with existing database tables with JPA. 我需要使用JPA处理现有的数据库表。 The tables are using composite primary keys. 这些表使用复合主键。 The foreign key attributes overlap with the primary key of the table. 外键属性与表的主键重叠。

Simplified example, each 'Order' has many 'OrderItems' 简化示例,每个“订单”都有许多“ OrderItems”

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

I created following Entities and ID-classes: 我创建了以下实体和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
}

But that doesn' work. 但这行不通。 So what do I need to do to to get a correct mapping from orderItem to order with respect to the overlapping and composite keys? 那么,对于重叠键和组合键,我需要怎么做才能从orderItem到订单正确映射呢?

Thank you for any help. 感谢您的任何帮助。 Daniel 丹尼尔


EDIT: 编辑:

Ok, here is another attempt that seems to work. 好的,这是另一种似乎可行的尝试。 Further testing required. 需要进一步测试。

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

Your foiegn key is just busindessDomain and not OrderId . 您的密钥仅是busindessDomain而不是OrderId Can you try this? 你可以试试这个吗?

@Entity    
    public class Order {



    @EmbeddedId
    private OrderPk orderId;

    //getter/setter...

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

OrderItem: 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;
    }       
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM