在OneToMany Mapping中

时间:2017-09-05 08:09:18

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

产品和ProductLine。一个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);
        }

控制器: -

在控制器中,我正在以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”。但我不希望删除旧数据。我该怎么办?

3 个答案:

答案 0 :(得分:1)

也许我错了...

但是当您使用它时,它似乎是@ManyToMany的一种映射方式:

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "PRODUCTLINE_PRODUCT", joinColumns = @JoinColumn(name = "PRODUCTLINE_ID"), inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID"))

如果是这样,那么自然的行为就是将旧列表替换为新列表... 如果您想要@OneToMany行为,则只需要这样做:

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

答案 1 :(得分:0)

此行为称为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<>();

答案 2 :(得分:0)

我可以通过加载ProductLine名称&#39; Apple&#39;来解决此问题。在使用findByName()方法的持久化上下文中,然后我将与productLine关联的所有产品作为列表加载,并将其添加到新创建的产品列表中。