使用Hibernate将多个Java对象映射到同一表中的不同行

时间:2018-07-20 15:49:58

标签: java spring hibernate jpa

我一直在寻找这个问题,但是大多数与每个表的多个对象相关的答案都在谈论继承或与我正在寻找的东西有些不同的东西。

我有几张桌子,我们称其为Vehicle and 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对象,并将表的地址信息从中推入并推到该地址。

我的问题是,这可能是我考虑的方式吗?这就是建立数据库的方式,这就是为什么我要寻找一种解决方法。我知道最好有一个单独的地址表。我可以将地址信息单独保存在每个对象中,而无需使用地址对象,但是我认为拥有一个单独的地址对象将有助于某些操作。

1 个答案:

答案 0 :(得分:0)

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

您将Address注释为@Embeddable,其字段将神奇地复制到每个拥有Address的实体中。