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