【问题标题】:JPA OneToOne relation on the same SQL table同一个 SQL 表上的 JPA OneToOne 关系
【发布时间】:2017-10-26 13:11:56
【问题描述】:

给定客户端类

public class Client {

 private String firstName;
 private String lastName;
 private Address address;
  //..//
 }

和地址类

public class Address {

private int houseNumber;
private String streetName;
private String city;
private String state;
private String zipCode;
private String country;
//...//
}

我已经创建了地址类,因为它在其他一些类中使用,我不想复制代码。有没有办法使用 JPA 将地址信息显式放入我的客户端 SQL 表中,而不是创建地址表并使用主键作为两者之间的链接?

【问题讨论】:

  • 客户表中是否有类地址的所有信息?那么对于行,您在 Client 和 Address 类中列出了所有数据?
  • 是的,我认为这对我来说是理想的。 (话虽这么说,我对 Java 持久性和所有东西还是新手,所以它可能不是最好的解决方案)
  • 你为什么不想创建一个地址表?尝试阅读有关数据库规范化的信息。
  • 在我看来,如果作为一个例子,我有使用地址的客户和商店,这意味着在我的地址表中,我的商店地址和客户地址对我来说毫无意义。
  • 地址是否属于客户或店铺,是否存储无关紧要。商店可以指向它需要的地址,也可以指向客户。如果您没有地址表,例如两个商店有相同的地址你存储了两次信息。它增加了你的冗余!

标签: java mysql hibernate jpa


【解决方案1】:

您不需要 OneToOne 关系,您可以使用 Embeddable 类型。

@Entity
public class Client {
    @Id
    private long id;
    private String firstName;
    private String lastName;
    @Embedded
    private Address address;
}

@Embeddable
public class Address {
    private int houseNumber;
    private String streetName;
    private String city;
    private String state;
    private String zipCode;
    private String country;
}

这样您就可以将表客户端映射到以下列:

first_name, last_name, house_number, street_name, city, state, zip_code, country

您可以在表中具有相同列的任何其他实体上重复使用地址。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    相关资源
    最近更新 更多