繁体   English   中英

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

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

我需要使用JPA处理现有的数据库表。 这些表使用复合主键。 外键属性与表的主键重叠。

简化示例,每个“订单”都有许多“ OrderItems”

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到订单正确映射呢?

感谢您的任何帮助。 丹尼尔


编辑:

好的,这是另一种似乎可行的尝试。 需要进一步测试。

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

您的密钥仅是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;
    }       
    }

暂无
暂无

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

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