级联在JPA中合并一对一的关系

时间:2015-07-04 07:08:13

标签: hibernate jpa eclipselink one-to-one

以下是一对一关系的例子。

OrderTable(mappedBy建议的反面):

public class OrderTable implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "order_id", nullable = false)
    private Long orderId;

    @Column(name = "order_status", length = 45)
    private String orderStatus;

    @OneToOne(mappedBy = "orderTable", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private Billing billing;

    private static final long serialVersionUID = 1L;

    // Constructors + getters + setters + hashcode() + equals() + toString().
}

拥有一方(拥有外键):

public class Billing implements Serializable {

    @Id
    @Basic(optional = false)
    @Column(name = "billing_id", nullable = false)
    private Long billingId;

    @Column(name = "first_name", length = 45)
    private String firstName;

    @JoinColumn(name = "billing_id", referencedColumnName = "order_id", insertable = false, updatable = false, nullable = false)
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    private OrderTable orderTable;

    private static final long serialVersionUID = 1L;

    // Constructors + getters + setters + hashcode() + equals() + toString().
}

尝试按如下方式级联合并。

Billing billing = entityManager.find(Billing.class, 1L);
billing.setFirstName("XXX");

OrderTable orderTable = entityManager.find(OrderTable.class, 8L);
orderTable.setOrderStatus("New");
orderTable.setBilling(billing);
billing.setOrderTable(orderTable);
entityManager.merge(orderTable);

此处,OrderTable会更新。另一方面,Billing并不直观,因为有一个主键也是一个外键。

OrderTable中的Billing似乎应由orderId8的新成员替换(更新),因为CascadeType位于反面设置为ALL。然而,它保持不变。只更新order_status表中的order_table列(orderTable.setOrderStatus("New");)(但不更新其billing_id,这是基础数据库表中的外键。)

以防万一,

OrderTable orderTable = entityManager.find(OrderTable.class, 8L);

替换为

OrderTable orderTable = new OrderTable();

创建order_table数据库表中的新行(保留相应的现有行),但billing_id数据库表中相应的billing保持不变(仅剩下的字段)如果要更新,则更新。

即使更新主键字段看起来不直观,是否可以用旧版本替换新的OrderTable

有目的地,CascadeType在一方面的一对一关系(反向和拥有)没有意义(除了CascadeType.REMOVECascadeType.PERSIST仅在反面) 。不是吗?

目前正在使用EclipseLink 2.6.0

0 个答案:

没有答案