简体   繁体   中英

JPA @OneToMany with composite PK - PK/FK overlapping

I need to work with existing database tables with 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'

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:

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

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 . 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:

@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;
    }       
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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