首页 > 解决方案 > 使用 Hibernate 将多个 Java 对象映射到同一个表中的不同行

问题描述

我环顾四周,但与每个表多个对象相关的大多数答案都在谈论继承或与我正在寻找的东西有点不同的东西。

我有几张桌子,我们称它们为 Vehicle 和 Order :

╔════╦════════════╗    ╔════╦════════════╗
║    ║  Vehicle   ║    ║    ║   Order    ║
╠════╬════════════╣    ╠════╬════════════╣
║ PK ║ id         ║    ║ PK ║ id         ║
║    ║    ...     ║    ║    ║    ...     ║
║    ║ address_id ║    ║    ║ address_id ║
║    ║ address    ║    ║    ║ address    ║
║    ║ city       ║    ║    ║ city       ║
║    ║ state      ║    ║    ║ state      ║
║    ║ zip        ║    ║    ║ zip        ║
╚════╩════════════╝    ╚════╩════════════╝

如您所见,地址信息在每个表中。还有其他字段,如 ... 所示,专门用于每个表。

我想要做的是将这些表中的地址信息映射到 Java 中的 Address 对象以单独处理。对于这些表中的每一个,我都从这样的事情开始:

@Data
@Entity
@Table(name = "vehicle")
@SuppressWarnings("serial")
public class Vehicle implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "vehicle_id")
    private int id;

    // other fields

    @Valid
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id")
    private Address address;

}

@Data
@Entity
@Table(name = "order")
@SuppressWarnings("serial")
public class Order implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "order_id")
    private int id;

    // other fields

    @Valid
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id")
    private Address address;

}

这些对象除了在同一个应用程序中之外不相关,因此这里没有继承或任何东西。我想有一个单独的 Address 对象,这两个对象都具有,并且表的地址信息从中提取并推送到该对象。

我的问题是,这可能是我的想法吗?这就是数据库的设置方式,这就是我寻找解决方法的原因;我知道为地址设置一个单独的表格可能会更好。我可以在没有地址对象的情况下单独保存每个对象中的地址信息,但我认为拥有一个单独的地址对象将有助于某些操作。

标签: javaspringhibernatejpa

解决方案


看来您正在寻找的是 JPA 的@Embeddable,请参见例如 https://en.wikibooks.org/wiki/Java_Persistence/Embeddables

您将注释Address@Embeddable,其字段将神奇地复制到每个拥有Address.


推荐阅读