java - OneToMany 映射中的旧数据被删除

标签 java jpa spring-boot one-to-many

产品和产品线。一个 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/

相关文章:

c# - 还有哪些其他语言支持 Go 的接口(interface)风格而无需显式声明?

java - 在线程中获取和设置标志变量

java - 无法使用 log4j2 创建日志文件

java - 如何让 Spring JPA、Hibernate 和 OSGi 发挥出色?

spring-boot - 如何忽略 spring-boot-cassandra 默认配置来加载 cassandra 连接实例

java - 如何将java数组放入作用域变量中?

java - 使 Hibernate 鉴别器值使用绑定(bind)变量而不是文字

spring - 如何在过去设置@CreatedDate(用于测试)

java - Spring 启动: How to inject the same instance of a prototype scoped bean into a Spring Boot Test?

Spring Boot 在 SpringApplication.run 之前检查属性