长话短说,不,这些设置并不相互排斥。
想象一下,我们有以下模型。
create table APP_USER
(
USER_ID number,
USER_NAME varchar2(400),
constraint APP_USER_PK primary key(USER_ID)
);
create table APP_BILLING_NUMBER
(
BILL_ID number,
BILL_ACCOUNT varchar2(20),
BILL_BANK_NAME varchar2(300),
BILL_USER_ID number,
constraint APP_BILLING_NUMBER_PK primary key(BILL_ID),
);
以及适当的休眠映射:
@Entity
@Table(name = "APP_USER")
public class User
{
@Id
@Column(name = "USER_ID")
private Long id;
@Column(name = "USER_NAME")
private String name;
}
@Entity
@Table(name = "APP_BILLING_NUMBER")
public class BillingNumber
{
@Id
@Column(name = "BILL_ID")
private Long id;
@Column(name = "BILL_ACCOUNT")
private String account;
@Column(name = "BILL_BANK_NAME")
private String bankName;
@ManyToOne
@JoinColumn(name="BILL_USER_ID")
private User user;
}
如果我们尝试做这样的事情:
User user = new User();
user.setId(1L);
user.setName("Alex");
BillingNumber bill = new BillingNumber();
bill.setId(1L);
bill.setAccount("EA12345678");
bill.setBankName("BNP Paribas");
bill.setUser(user);
session.persist(bill);
我们会发现账单被添加到APP_BILLING_NUMBER表中,
SQL> select * from APP_BILLING_NUMBER;
BILL_ID BILL_ACCOUNT BILL_BANK_NAME BILL_USER_ID
------- ------------ -------------- ------------
1 EA12345678 BNP Paribas 1
但用户不是。这是因为默认情况下我们有@ManyToOne(cascade={})。如果我们想用BillingNumber 实体持久化User 实体,我们应该添加CascadeType.PERSIST:
@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinColumn(name="BILL_USER_ID")
private User user;
那么,如果我们要使用session.merge(bill) 操作,我们也应该添加CascadeType.MERGE。
现在想象一下,我们有
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name="BILL_USER_ID", insertable = false, updatable = false)
private User user;
执行上述持久化操作后,我们将有:
SQL> select * from APP_USER;
USER_ID USER_NAME
------- ---------
1 Alex
SQL> select * from APP_BILLING_NUMBER;
BILL_ID BILL_ACCOUNT BILL_BANK_NAME BILL_USER_ID
------- ------------ -------------- ------------
1 EA12345678 BNP Paribas (null)
如您所见,两个实体均已插入,但 APP_BILLING_NUMBER.BILL_USER_ID 引用为 null,因为 @JoinColumn(..., insertable = false, ...)。并且因为updatable = false而无法更新。
所以,这是一个有效但非常奇特的案例。