@ManyToOne和@OneToOne在同一实体上

时间:2019-11-26 10:18:50

标签: java spring hibernate jpa

假设我们有以下两个实体:

@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)。关键是,我知道这是错误的,但我不知道如何正确映射它。有设计上的问题吗?逻辑是,用户具有一个地址列表以及一个和唯一的主体地址。如何正确映射?有什么主意吗?

3 个答案:

答案 0 :(得分:2)

在这种情况下,您可以做的是标记“ 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;

   ...
}

答案 1 :(得分:1)

只需在boolean类中创建一个isPrimaryAddress Address字段

答案 2 :(得分:0)

在库类中添加标志不是一个好的解决方案。这是一个非常糟糕的主张。 所有用户都依赖一个库类地址。他们都有(或可能有)不同的“主要地址”。因此,您需要在User类中创建一个关系结构(表)或一个字段。 我认为您的初始变体更好,只需在依赖于用户字段的@OneToOne选项'mappedBy'中使用即可(例如,'primaryAddress'-对Address(bookId)的引用)。

添加:如果使用注释@OneToOne(以及其他注释),则不必具有双向关系,可以在User类中使用@OneToOne,但在Address类中不要使用它,通常它没有任何关系感。