给定以下具有双向一对多关系的JPA实体
@Entity
public class Cart {
@OneToMany(mappedBy="cart")
private Set<Items> items;
// getters and setters
}
@Entity
public class Items {
@ManyToOne
@JoinColumn(name="cart_id", nullable=false)
private Cart cart;
// getters and setters
}
如果我从已经包含一些项目的数据库加载购物车
Cart cartWithItems = CartRepository.findById(cartId);
我想用一个新的物品集合替换购物车中的物品
Set<Item> newCartItems = ItemRepository.findAllById(newItemIds);
执行此更换的最简单/最佳方法是什么?理想情况下,我希望生成的SQL语句合理高效,但我的主要目标是使用简洁易读的代码执行替换。
为了明确我所说的替换是什么意思,如果购物车最初包含ID为2、3、4的项目,并且newItemIds
包含4、5、6,那么在替换之后,购物车应该包含ID为4、5、6的项目。
我建议在你的OneToMany
注释中添加orphanRemoving=true
,然后从购物车中移除物品。此外,我建议使用add
方法处理双向部分,如下所示:
public void addItem(Item item) {
if(item != null) {
this.items.add(item);
item.setCart(this);
}
}
如果需要,还可以添加删除
功能。addItem
函数可以这样使用:
cartWithItems.setItems(new HashSet<>());
newCartItems.forEach(cartWithItems::addItem);
希望这能回答你的问题。
第404页的“Java持久性2.0,最终发布”有以下示例: 示例3:从一个可嵌入类到另一个实体的一对一关联。 我希望员工内部有多个位置详细信息: 如何更改实体ParkingSpot以指向集合表EMP_LOCATION内的可嵌入Location细节。 应该是 替换为@ElementCollection? 非常感谢。
问题内容: 我的实体中存在双向多对多关系。请参阅以下示例: 当我尝试将其序列化为JSON时,出现以下异常: “ java.lang.IllegalArgumentException:无法处理托管/反向引用’COLLABORATION_TAG’:反向引用类型(java.util.Set)与托管类型(foo.Collaboration)不兼容。 实际上,我知道这很有意义,因为javadoc明确声明您不
我在我的实体中有一种双向的多对多关系。请参见下面的示例: 当我尝试将其序列化为JSON时,我得到了以下异常:' “java.lang.IllegalArgumentException:无法处理托管/反向引用'COLLABORATION_TAG':反向引用类型(java.util.Set)与托管类型(foo.COLLABORATION)不兼容。”。 实际上,我知道这是有道理的,因为javadoc明确
假设我们要实现一个简单的从 Parent 到 Child 的 <one-to-many> 关联。 <set name="children"> <key column="parent_id"/> <one-to-many class="Child"/> </set > 如果我们运行下面的代码: Parent p = .....; Child c = new Child(); p.
我在和之间具有双向多对多关系。在的帮助下创建两个实体,甚至创建它们的子实体都是简单明了的。 和都可以在的帮助下轻松地自动持久化,如下所示: 然而...更新会导致异常: 我尝试修改的以包括、和/或,但未成功。我们怎么绕过这件事?
1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有