簡體   English   中英

JPA Hibertane 單向一對一與共享主鍵先保存父級 NO REVERSE

[英]JPA Hibertane unidirectional one-to-one with shared primary key save parent first NO REVERSE

我一直在互聯網上尋找答案,但沒有什么對我有用。 有很多類似案例的主題,但具體細節有所不同,這使得它們對我來說無法使用。

所以我有兩個表:t_item 和 t_item_info:

在此處輸入圖像描述

t_item_info表中的item_id字段引用t_item表中的id字段。 我正在使用 mysql db 和id列形式t_item自動遞增

我需要以特定方式進行單向一對一映射。 這是我的課程:

@Entity
@Table(name = "t_item")
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "item_id")
    private ItemInfo info;
}

還有一個

@Entity
@Table(name = "t_item_info")
public class ItemInfo {
    @Id
    private Long itemId;

    private String descr;
}

所以關鍵是我需要Item object 來引用ItemInfo object。 不是另一種方式!

Item -> ItemInfo   --YES
Item <- ItemInfo   --NO

另一件事是我需要父母( Item ) id 成為孩子的 id ( ItemInfo

例如,我使用 null id 創建Item object 並使用ItemInfo object 設置它的信息字段,其中也有 Z37A6259CC0C1DAE298 FF0BDA 字段。 像這樣:

{
  "id": null,
  "name": "Some name",
  "info": {
    "itemId": null,
    "descr": "some descr"
  }
}

然后當項目object 持續存在時 hibernate 應該為父(項目) object 生成 id 並將其設置為子項目( ItemInfo )的 itemId 字段。

我一直在嘗試使用不同的 hibernate 注釋來實現這一點,我注意到無論我多么努力地嘗試 Hibernate 似乎總是首先嘗試堅持子 object 當我打開 sql 登錄時,我在日志中注意到了這一點。 插入 t_item_info 總是先行(並且因為 null id:D 而死)

所以問題是:是否有可能實現這一點,如果可以,我應該在我的代碼中進行哪些更改才能做到這一點

鑒於我的解釋不佳,我希望我要問的問題對您有意義=)

為什么人們總是堅持一對一關聯中的子表 object 應該是具有外鍵的表,這超出了我的理解。

無論如何,作為一種解決方法,由於兩個對象共享id並且關聯是非可選的,您不妨為子 object 聲明自動生成的密鑰:

@Entity
@Table(name = "t_item_info")
public class ItemInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long itemId;

    private String descr;
}

然后為父級使用@MapsId

@Entity
@Table(name = "t_item")
public class Item {
    @Id
    private Long id;

    private String name;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "id")
    @MapsId
    private ItemInfo info;
}

請注意,這種方法在某種意義上會愚弄 Hibernate 以為它是應該被視為子 object 的Item 你被警告了。

雖然這里有一個公認的答案,但在我看來, @Secondary表將是一個更好、更方便的解決方案:您可能在數據庫級別有 2 個表,但我認為沒有任何理由需要將該事實暴露給任何客戶端代碼. 好像沒有很多好處? 下面給大家一個更簡單的API。

實體:

@Entity
@Table(name = "t_item")
@SecondaryTable("t_item_info",  pkJoinColumns={
        @PrimaryKeyJoinColumn(name="id", referencedColumnName="item_id")})
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @Colulumn(name = "description", table= "t_item_info"")
    private String description;
}

API:

{
  "id": null,
  "name": "Some name",
  "descr": "some descr"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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