簡體   English   中英

使用 ID 的單向 @OneToOne

[英]Unidirectional @OneToOne using IDs

我想使用 ID 創建@OneToOne單向關系。 讓我們考慮以下示例:

@Table(name = "user")
@Entity
class User (

    @Id
    @GeneratedValue(...)
    var id: Long? = null,

    @OneToOne
    var address: UserAddress? = null
)

@Table(name = "user_address")
@Entity
class UserAddress(
    @Id
    var id: Long? = null,

    (...)
)

在數據庫上,引用user.id user_address.id有一個外鍵約束。 我嘗試使用許多不同的注釋組合,但仍然存在刪除問題。 我正在使用 User 的 JpaRepository 並且當userRepository.deleteById(id)被調用時,只有孩子( address )被刪除,而不是父母( user )。 我真的很想保留名稱為“id”的@Id列。 甚至有可能嗎?

編輯

當我使用以下代碼時:

@Table(name = "user")
@Entity
class User (

    @Id
    @GeneratedValue(...)
    var id: Long? = null,

    @OneToOne(cascade = [CascadeType.All])
    @JoinColumn(name = "id", referencedColumnName = "id")
    var address: UserAddress? = null
)

@Table(name = "user_address")
@Entity
class UserAddress(
    @Id
    var id: Long? = null,


    @OneToOne(mappedBy = "address")
    var user: User? = null
    (...)
)

userRepository.deleteById(id) ,只會刪除 child。 我不知道為什么......此外,我想保持這種關系單向。

編輯用戶存儲庫

@Repository
interface UserRepository : JpaRepository<User, Long> {
}

編輯 - 解決好的。 我有另一個實體(我們稱之為公司),它有Set<User> 事實證明,擁有它 Fetch。 EAGER 防止用戶被刪除...感謝大家的時間。 我不知道這可能是一個問題,所以我沒有提到它......

您需要的是級聯刪除,您可以通過將orphanRemoval=true傳遞給您的@OneToOne注釋來實現。

例子:

    @OneToOne(orphanRemoval=true)
    var address: UserAddress? = null

或者,您也可以使用cascade=CascadeType.REMOVE而不是orphanremoval=true

ObjectDB借來的:

如果指定了orphanRemoval=true則自動刪除斷開連接的 Address 實例。 這對於清理在沒有所有者對象(例如員工)的引用的情況下不應該存在的依賴對象(例如地址)很有用。 如果僅指定了cascade=CascadeType.REMOVE則不會采取自動操作,因為斷開關系不是刪除操作。

希望這可以幫助!

各種問題。

  • 映射是錯誤的。 @JoinColumn需要在另一邊,即與 FK。 您現在定義它的方式實際上是在說 Address 依賴於(有一個 FK to)地址。

  • 您已經在依賴實體上重新定義了@Id字段,即使它從User實體派生其 ID。 您需要刪除它並通過用@Id注釋關系來表明它是共享的主鍵關系。

鑒於此,您需要將其設為雙向關系:

用戶:

@Table(name = "user")
@Entity
class User (

    @Id
    @GeneratedValue(...)
    var id: Long? = null,

    @OneToOne(cascade = [CascadeType.All], mappedBy="user")
    var address: UserAddress? = null
)

地址:

@Table(name = "user_address")
@Entity
class UserAddress(
    @Id
    @OneToOne
    @JoinColumn(name = "id", referencedColumnName = "id")
    var user: User? = null
    (...)
) 

暫無
暫無

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

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