旧数据在OneToMany映射中被删除

Sun*_*nny 5 java jpa one-to-many spring-boot

产品和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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

ProductLineRepository.java

 public interface ProductLineRepository extends JpaRepository<ProductLine,Integer> {
            ProductLine findOneById(String id);
        ProductLine findOneByName(String name);
        }
Run Code Online (Sandbox Code Playgroud)

控制器:

在控制器中,我正在解析用户以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);
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果产品线“ Apple”已经存在,则它将删除产品线表中名称为“ Apple”的条目,然后再次插入数据“ IPhone”和“ Mac”。但是我不希望删除旧数据。我该怎么办?

Ame*_*bsa 1

此行为称为 orphanRemoval,当从关系中删除实体时(这就是您在设置新产品列表时所做的操作),它将被删除。

由于 JPA 2.0,orphanRemoval 的默认值为 false,因此如果您使用此版本或更高版本,则不应出现此行为,所以我猜您使用的是较低版本,要么使用较高版本,要么可以将 orphanRemoval 属性设置为 false

@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<>();
Run Code Online (Sandbox Code Playgroud)