簡體   English   中英

主鍵為外鍵的一對一映射-需要哪些注釋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM