Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OneToMany映射中的旧数据正在被删除_Java_Jpa_Spring Boot_One To Many - Fatal编程技术网

Java OneToMany映射中的旧数据正在被删除

Java OneToMany映射中的旧数据正在被删除,java,jpa,spring-boot,one-to-many,Java,Jpa,Spring Boot,One To Many,产品和生产线。一条生产线可以有许多产品 Product.java:- @Entity @Table(name ="PRODUCT") public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; Product(String name){

产品和生产线。一条生产线可以有许多产品

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;
        }
    }
 public interface ProductLineRepository extends JpaRepository<ProductLine,Integer> {
            ProductLine findOneById(String id);
        ProductLine findOneByName(String name);
        }
公共类产品线{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
@OneToMany(级联=级联类型.ALL)
@JoinTable(name=“PRODUCTLINE\u PRODUCT”,joinColumns=@JoinColumn(name=“PRODUCTLINE\u ID”),inverseJoinColumns=@JoinColumn(name=“PRODUCT\u ID”))
私有列表产品=新的ArrayList();
公共产品线(字符串名称){
this.name=name;
}
}
ProductLineRepository.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;
        }
    }
 public interface ProductLineRepository extends JpaRepository<ProductLine,Integer> {
            ProductLine findOneById(String id);
        ProductLine findOneByName(String name);
        }
公共接口ProductLineRepository扩展了JpaRepository{
ProductLine findOneById(字符串id);
ProductLine findOneByName(字符串名称);
}
控制器:-

@Entity
    @Table(name ="PRODUCT")
    public class Product {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int id;
        private String name;
    Product(String name){
            this.name=name;
        }
    }
在控制器中,我有一个am以json格式解析来自用户的与产品相关联的产品列表,并将其持久化到DB中

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);
    }
public void addData(){
列表产品=新的ArrayList();
product1=新产品(“Iphone”);
产品2=新产品(“Mac”);
产品。添加(产品1);
产品。添加(产品2);
ProductLine ProductLine=productLineRepository.findOneByName(“苹果”);
productLine.setProducts(产品);
productLineRepository.save(productLine);
}

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

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

由于JPA 2.0,孤儿删除的默认值为false,因此如果您使用的是此版本或更高版本,则此行为不应存在,因此我猜您使用的是较低版本,您可以使用较高版本,也可以将孤儿删除属性设置为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<>();
@OneToMany(cascade=CascadeType.ALL,false=“false”)
@JoinTable(name=“PRODUCTLINE\u PRODUCT”,joinColumns=@JoinColumn(name=“PRODUCTLINE\u ID”),inverseJoinColumns=@JoinColumn(name=“PRODUCT\u ID”))
私有列表产品=新的ArrayList();

我可以通过使用findByName()方法在持久性上下文中加载名为“Apple”的产品线来解决这个问题,然后我将与产品线关联的所有产品作为列表加载,并将其添加到新创建的产品列表中。

也许我错了

但当你使用它时,它似乎是一种@manytomy类型的映射:

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name=“PRODUCTLINE\u PRODUCT”,joinColumns=@JoinColumn(name=“PRODUCTLINE\u ID”),inverseJoinColumns=@JoinColumn(name=“PRODUCT\u ID”))
如果这是真的,它的自然行为将旧列表替换为新列表。。。 如果你想要一个@OneToMany行为,你只需要:

@OneToMany(mappedBy=“product”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)

删除了哪些条目?正在删除产品表中的旧数据。
productLine.setProducts(产品)您希望发生什么?尝试将新条目添加到现有集合。您的jpa版本是什么?