【问题标题】:Spring JPA Multiple Many-To-One Relationships in One EntitySpring JPA 一个实体中的多个多对一关系
【发布时间】:2019-04-07 05:25:29
【问题描述】:

我正在尝试创建一个实体,用户有两个地址,一个家庭地址和一个工作地址。

我不想将地址信息直接存储在 User 类中,而是对其进行规范化并将所有地址存储在一个表中,然后将它们链接到用户。像这样:

@Entity
public class User {

    @Id
    private Integer id;
    private Address homeAddress;
    private Address workAddress;

    // getters and setters
}

@Entity
public class Address {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    private Integer id;
    private String streetNumberAndName;
    private String apartmentOrSuiteNumber;
    private String city;
    private String state;
    private String zipcode;

    // getters and setters
}

如何使用 Spring JPA 执行此操作?我知道这是一个多对一关系,但我不确定如何将两个多对一关系映射到一个实体。这甚至可能吗?

非常感谢任何帮助。

谢谢!

【问题讨论】:

  • 如果您只想单向User 映射到Address,这应该不是问题:只需完全按照您的方式映射homeAddressworkAddress如果每个人都是唯一的Address
  • @KevinAnderson 这样就足够了:在 OneToMany 私人地址 homeAddress;在 OneToMany 私有地址 workAddress;
  • 应该是 @ManyToOne 而不是 @OneToMany,而且两者都应该是 @JoinColumn(referencedColumnName="id")。试一试。可能发生的最坏情况是来自 JPA 的恶意消息说“你不能那样做”,然后我们必须尝试其他方法。

标签: java spring spring-boot jpa


【解决方案1】:

这真的很简单。只需将您的 User 类映射为:

@Entity
public class User {

    @Id
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "fk_home_address")
    private Address homeAddress;

    @ManyToOne
    @JoinColumn(name = "fk_work_address")
    private Address workAddress;

    // getters and setters
}

表结构如下:

user(id, fk_home_address, fk_work_address)

请注意,这是一种单向关系。

如果您想了解更多信息,查找示例的最佳位置是here。 如果您正在寻找双向关系,请了解here

【讨论】:

  • 感谢您的回答。现在我正在更多地考虑我的设计,我需要考虑两个可以共享相同地址的用户。例如,居住在同一地址的配偶或在同一地址工作的同事。为了解决这个问题,我需要将我的关系从 ManyToOne 更改为 ManyToMany。在这种情况下我的理解是否正确?
  • 不,不。映射将与我在回答中描述的完全一样。无需将其更改为多对多。 ManyToMany 只是针对您需要的情况:“单个用户可以有多个家庭地址和多个工作地址,并且可以在多个用户中设置相同的地址”。请注意,我所做的是 ManyToOne,而不是 OneToOne。多对一意味着:可以在多个用户中设置同一个地址。 OneToOne 表示:此地址只能在一个用户中设置。
  • 感谢您的解释!
【解决方案2】:
private Integer id;
private Address homeAddress;
private Address workAddress;

在第一种情况下,您的结构表将是

user(id,home_address_id,work_address_id)

你可以考虑第二种结构

private Integer id;
private List<Address> userddress;//using one to many

您的表结构将是

address(id,user_id)

这取决于你想如何组织结构。

【讨论】:

  • 不,如果你把 Address 当作一个列表,这个结构实际上就是 address(id, user_id)。
猜你喜欢
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
相关资源
最近更新 更多