【发布时间】:2020-08-22 14:16:28
【问题描述】:
我有以下物品:
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Entity(name="Group")
public class Group {
@Id
@GeneratedValue
@NotNull
@Column(name = "GROUP_ID")
private Long id;
@Column(name="NAME")
private String name;
@OneToMany(
targetEntity = Product.class,
mappedBy = "groupId",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
private List<Product> products = new ArrayList<>();
public Group(String name) {
this.name = name;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity(name="Product")
public class Product {
@Id
@GeneratedValue
@NotNull
@Column(name="PRODUCT_ID")
private Long id;
@Column(name="NAME")
private String name;
@Column(name="DESCRIPTION")
private String description;
@Column(name="PRICE")
private double price;
@ManyToMany
@JoinTable(
name = "JOIN_PRODUCT_CART",
joinColumns = {@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "PRODUCT_ID")},
inverseJoinColumns = {@JoinColumn(name = "CART_ID", referencedColumnName = "CART_ID")}
)
private List<CartEntity> carts = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "GROUP_ID")
private Group groupId;
public Product(String name, String description, double price) {
this.name = name;
this.description = description;
this.price = price;
}
public Product(String name, String description, double price, Group groupId) {
this(name, description, price);
this.groupId = groupId;
}
public void addToCart(CartEntity cart) {
this.carts.add(cart);
cart.getProductsList().add(this);
}
public void addGroup(Group group) {
group.getProducts().add(this);
this.groupId = group;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "cart")
public class CartEntity {
@Id
@NotNull
@GeneratedValue
@Column(name = "CART_ID")
private Long id;
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "carts")
private List<Product> productsList = new ArrayList<>();
public void addProduct(Product product) {
productsList.add(product);
product.getCarts().add(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CartEntity that = (CartEntity) o;
return id.equals(that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
现在,当我进行以下测试时:
public class ProductDaoTestSuite {
@Autowired
private ProductDao productDao;
@Autowired
private CartDaoStub cartDaoStub;
@Autowired
private GroupDao groupDao;
@Test
public void testDeleteProduct() {
// Given
Product product = new Product("test", "testProduct", 100.0);
Group group = new Group("group1");
CartEntity cart = new CartEntity();
product.addGroup(group);
cart.addProduct(product);
// When
groupDao.save(group);
productDao.save(product);
cartDaoStub.save(cart);
Long groupId = group.getId();
Long productId = product.getId();
Long cartId = cart.getId();
productDao.deleteById(productId);
// Then
Assert.assertTrue(cartDaoStub.findById(cartId).isPresent());
Assert.assertEquals(0, cartDaoStub.findById(cartId).get().getProductsList().size());
Assert.assertTrue(groupDao.findById(groupId).isPresent());
Assert.assertEquals(0, groupDao.findById(groupId).get().getProducts().size());
删除产品后,我希望与它在组和购物车中的关联消失(产品从他们的列表关系字段中消失)。但是,目前还没有发生这种情况。当我在删除产品后使用 Group/Cart Dao 从数据库中提取组和购物车时,他们的列表中仍然有产品,而从数据库中提取的产品返回为 null。 我尝试为 @OneToMany 注释添加“orphanRemoval = true”值,但它似乎不适用于 Group 实体。
我做错了什么?
我已经开始尝试将所有类型的级联(除了 REMOVE)添加到 Product 类的 @ManyToOne,但到目前为止还没有成功。
【问题讨论】:
-
实体
group和cart代表删除前的状态。从数据库中重新获取实体,新获取的实体将不再具有已删除的产品。 -
我是通过 cartDaoStub.findById(cartId) 和 groupDao.findById(groupId) 来做的,这些新获取的实体的列表中仍然有产品。
-
这很奇怪……总之,
product-entity 仍应存储在数据库中。这是正确的吗? -
是的,这很奇怪。删除后的实体产品不再存在于数据库中。它是否改变了我使用 H2 数据库的任何内容?
-
它不应该......您是手动创建模式还是由休眠自动生成的?通常,连接表上应该有外键约束,因此数据库应该拒绝删除,因为数据库行被另一行引用。