[英]One-to-one mapping where primary key is foreign key - what annotations are required
我有以下表格:
Table: MyEntity {
MyEntityId: primary-key, auto-generated
// other fields ommited
}
Table: MyEntityLastAction {
MyEntityId: primary-key
// other fields ommited
}
MyEntityLastAction.MyEntityId
有一個約束,它必須存在於MyEntity
。 (這是一個外鍵) MyEntityLastAction
是一個非常大的記錄,因此為什么將其拆分為另一個表 我無法正確設置實體注釋。 我大致在這里:
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long myEntityId;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public MyEntityLastAction lastAction;
}
@Entity
public class MyEntityLastAction {
@Id
public long myEntityId;
@OneToOne(mappedBy = "MyEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "MyEntityId")
public MyEntity myEntity;
}
我想嘗試運行以下圖像:
MyEntity myEntity = new MyEntity();
myEntity.lastAction = new MyEntityLastAction();
em.save(myEntity);
我認為您正在尋找@MapsId
注釋。 這使您可以使用具有共享主鍵的@OneToOne
。
請參閱以下代碼以供參考:
@Entity
class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long myEntityId;
@OneToOne(mappedBy = "myEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public MyEntityLastAction lastAction;
}
@Entity
class MyEntityLastAction {
@Id
public long myEntityId;
@OneToOne
@JoinColumn(name="MyEntityId")
@MapsId
public MyEntity myEntity;
}
並保存實體:
MyEntity me = new MyEntity();
me.lastAction = new MyEntityLastAction();
me.lastAction.myEntity = me;
entityManager.persist(me);
有兩個問題:首先,您的mappedBy
屬性應該是MyEntity
的字段名稱(在本例中為lastAction
)。 其次,由於mappedBy
屬性指示關系的另一端處理應如何將兩個對象鏈接在一起,因此需要將聯接列注釋移到那里。 這應該工作:
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long myEntityId;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@PrimaryKeyJoinColumn(name = "MyEntityId")
public MyEntityLastAction lastAction;
}
@Entity
public class MyEntityLastAction {
@Id
public long myEntityId;
@OneToOne(mappedBy = "lastAction", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public MyEntity myEntity;
}
請注意,如果使用JPA創建新的MyEntity
,它將不會在其中級聯新的MyEntityLastAction
。 你必須堅持先MyEntity
,然后在設定的ID MyEntityLastAction
到一個分配給MyEntity
,然后堅持MyEntityLastAction
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.