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