产品和产品线。一个 ProductLine 可以有很多产品。
Product.java:-
@Entity
@Table(name ="PRODUCT")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
Product(String name){
this.name=name;
}
}
ProductLine.java
public class ProductLine {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "PRODUCTLINE_PRODUCT", joinColumns = @JoinColumn(name = "PRODUCTLINE_ID"), inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID"))
private List<Product> products=new ArrayList<>();
public ProductLine(String name){
this.name=name;
}
}
ProductLineRepository.java
public interface ProductLineRepository extends JpaRepository<ProductLine,Integer> {
ProductLine findOneById(String id);
ProductLine findOneByName(String name);
}
Controller :-
在 Controller 中,我有一个正在以 json 形式解析与来自用户的产品关联的产品列表并将其保存到数据库中。
public void addData(){
List<Product> products=new ArrayList<>();
Product product1=new Product("Iphone");
Product product2=new Product("Mac");
products.add(product1);
products.add(product2);
ProductLine productLine=productLineRepository.findOneByName("Apple");
productLine.setProducts(products);
productLineRepository.save(productLine);
}
现在,如果产品线“Apple”已经存在,那么它将删除产品线表中名称为“Apple”的条目,然后再次插入数据“IPhone”和“Mac”。但我不想删除旧数据。我该怎么办?
最佳答案
此行为称为 orphanRemoval,当一个实体从关系中删除时(这是您在设置新产品列表时所做的),它将被删除。
自 JPA 2.0 以来,orphanRemoval 的默认值为 false,因此,如果您使用的是此版本或更高版本,则不应出现此行为,所以我猜您使用的是较低版本,您可以使用较高版本,也可以将 orphanRemoval 属性设置为假的
@OneToMany(cascade = CascadeType.ALL, orphanRemoval="false")
@JoinTable(name = "PRODUCTLINE_PRODUCT", joinColumns = @JoinColumn(name = "PRODUCTLINE_ID"), inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID"))
private List<Product> products=new ArrayList<>();
关于java - OneToMany 映射中的旧数据被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46049996/