以下是一对一关系的例子。
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
似乎应由orderId
为8
的新成员替换(更新),因为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.REMOVE
和CascadeType.PERSIST
仅在反面) 。不是吗?
目前正在使用EclipseLink 2.6.0