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

标签 java jpa overlapping composite-primary-key

我需要使用 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 的重叠键和复合键的正确映射?

感谢您的帮助。 丹尼尔 <小时/>

编辑:

好吧,这是另一个似乎有效的尝试。 需要进一步测试。

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

最佳答案

您的 foiegn key 只是 busindessDomain 而不是 OrderId。你能试试这个吗?

@Entity    
    public class Order {



    @EmbeddedId
    private OrderPk orderId;

    //getter/setter...

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

订单项目:

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

关于java - JPA @OneToMany 具有复合 PK - PK/FK 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21908086/

相关文章:

java - 如何从 Android 应用程序调用 Java Web 服务?

java - 保存从 DTO 转换的实体时,hibernate 抛出 TransientPropertyValueException : object references an unsaved transient instance"

java - Jersey JAX-RS 自动生成的网络服务和 MSSQL 身份字段

html - div重叠每次都不起作用

css - 为什么我的图像重叠?

java在运行时生成类文件

java - 将 Openfire-Server 集成(嵌入)到另一个 Java 项目中

mysql - 在没有 native 查询的情况下在 JPA 中更新

html - 鼠标悬停时,CSS 按钮没有响应

java - 无法使用 JSON 实体测试 Jax-rs