gpt4 book ai didi

java - 如何在 JPA 中正确关联具有多个键的表

转载 作者:行者123 更新时间:2023-12-02 10:55:05 24 4
gpt4 key购买 nike

我正在寻找一种方法来以一对多关系关联两个具有多个键的表。我有以下实体,也许这是一个设计不佳的示例,但尽管如此:

项目

@Id
@Column(name = "item_id", columnDefinition = "INT(11)")
private Long itemId;

@Id
@Column(name = "name", columnDefinition = "VARCHAR(50)")
private String name;

@Column(name = "price", columnDefinition = "DECIMAL(12, 2)")
private Double price;

订单

@Id
@Column(name = "order_id", columnDefinition = "INT(11)")
private Long orderId;

@Id
@Column(name = "order_number", columnDefinition = "INT(11)")
private Long orderNumber;


@Column(name = "date", columnDefinition = "DATE")
private Date date;

@Column(name = "item_count", columnDefinition = "INT(11)")
private Long itemCount;

我需要在这些实体之间建立一对多关系,以便订单包含多个项目。

我的要求是最终的 Orders 表结构包含以下字段:

order_id,
order_number,
date,
item_count,
item_id

为了将项目(一侧)与订单(多侧)相关联,我必须执行以下操作

项目

@OneToMany(fetch = FetchType.LAZY, mappedBy="item")
private List<Order> orders = new ArrayList<Order>();

订单

@ManyToOne
@JoinColumns({
@JoinColumn(name = "item_id"),
@JoinColumn(name = "name")
})
private Item item;

这可以编译,但现在我的订单表包含一个名为“名称”的字段,这是我试图避免的。我如何仅通过 item_id 而不是 item_id + name 来关联表?

最佳答案

我会向您推荐几件事:

使用代理键

每个实体只能有一个@Id注释。即使您的域有一个自然的复合 key - 使用生成的(代理) key 。

除了它是广泛使用的模式之外,它还解决了 item_id + name 关系的问题。

避免双向映射

双向映射极大地增加了代码复杂性并降低了可维护性。此外,几乎在所有情况下都不需要它并且可以轻松删除。

避免延迟加载

如果您只需要加载 Orders 而没有 Items,请使它们独立而没有任何惰性(不要使用 @OneToMany 映射)。

如果在大多数情况下您一起使用它们 - 急切地加载项目。

这样做可以避免“SessionClosedException”尝试调用通常的 POJO getter。

关于java - 如何在 JPA 中正确关联具有多个键的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com