簡體   English   中英

@ManyToOne和@OneToOne在同一實體上

[英]@ManyToOne and @OneToOne on the same entity

假設我們有以下兩個實體:

@Entity
class Address{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long bookId;

   @ManyToOne
   @OneToOne
   private User user;

   ...
}

@Entity
class User{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long userId;

   @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
   private List<Address> addresses;

   @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
   private Address principalAddress;

   ...
}

如您所見,我在Address類的User實體頂部有兩個注釋(@ManyToOne和@OneToOne)。 關鍵是,我知道這是錯誤的,但我不知道如何正確映射它。 有設計上的問題嗎? 邏輯是,用戶具有一個地址列表以及一個和唯一的主體地址。 如何正確映射? 任何的想法?

在這種情況下,您可以做的是標記“ isPrincipalAddress”。

@Entity
class Address{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long bookId;

   private Boolean isPrincipalAddress;

   @ManyToOne
   private User user;

   ...
}

@Entity
class User{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long userId;

   @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
   private List<Address> addresses;

   ...
}

只需在Address類中創建一個boolean isPrimaryAddress字段

在庫類中添加標志不是一個好的解決方案。 這是一個非常糟糕的主張。 所有用戶都依賴一個庫類地址。 他們都有(或可能有)不同的“主要地址”。 因此,您需要在User類中創建一個關系結構(表)或一個字段。 我認為您的初始變體更好,只需在依賴於用戶字段的@OneToOne選項'mappedBy'中使用(例如,'primaryAddress'-對Address(bookId)的引用)。

另外:如果使用注釋@OneToOne(以及其他注釋),則不必具有雙向關系,可以在User類中使用@OneToOne,但在Address類中不要使用@OneToOne,通常它沒有任何意義。

暫無
暫無

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

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