【发布时间】:2020-06-12 01:36:59
【问题描述】:
class StockPlace{
private Stock stock;
private Place place;
}
所以这个类描述了特定地点的特定股票,它可以随着时间而改变。就像一个地方可以包含另一只股票,但在给定的时间,一个地方只有一只股票,而那个地方只包含那只股票。我在定义我应该使用的注释时遇到了麻烦,有人可以帮忙吗?
【问题讨论】:
class StockPlace{
private Stock stock;
private Place place;
}
所以这个类描述了特定地点的特定股票,它可以随着时间而改变。就像一个地方可以包含另一只股票,但在给定的时间,一个地方只有一只股票,而那个地方只包含那只股票。我在定义我应该使用的注释时遇到了麻烦,有人可以帮忙吗?
【问题讨论】:
就像一个地方可以包含另一只股票,但在给定的时间,一个地方只有一只股票,而那个地方只包含那只股票
您有点不清楚,但如果我理解正确,您是在说特定位置只能有一只股票的情况?
一个地方可以包含另一个股票,但只有在原始股票从那个地方移除之后?
我假设 StockPlace 也将是一种具有单个股票当前位置的实体。
如果是这样,那么对这两个字段都使用@OneToOne,因为它定义了类之间的关系,即 Place 和 Stock 只能存在 StockPlace 的一行/记录,反之亦然。这意味着,在持久化 StockPlace 时必须使用唯一的库存和唯一的位置。在这里,如果您尝试将 StockPlace 与已被持久化的地点或库存一起持久化。你会得到一个例外。
字段上的@OneToMany 注释定义了使用该注释声明字段的对象可以有许多记录映射到它的位置之间的关系。它主要(如果不是唯一的话)是指该类可以具有映射项的集合。
例如,described here 一个购物车可以包含多个商品,因此它将List<Item> 映射到@OneToMany 或者单个商品可以有多个cmets。
为了涵盖可能有多个 StockPlace 位于同一个位置的情况,则 place 字段应使用 @ManyToOne 注释,因为它表示可以将单个 Place 记录分配给多个 StockPlace 记录(因此许多股票可以在一个地方)。
我想,我真的不明白这样的用例;P 因为在这两种情况下,一个 Place 可以同时包含多个和单个 Stock,可以在 Stock 类中使用 OneToOne 为唯一 Stock 声明 Place /地方组合或ManyToOne,如果一个地方可以同时有多个股票。
看看这两个 SO 帖子:
setting the correct jpa mapping for shopping cart items and product
Hibernate ManyToOne vs OneToOne
对于所有这三个注释的一些不同的解释和使用细节。
【讨论】: