【问题标题】:Nested Object Insert takes time -Spring Data JPA, Hibernate and MySQL嵌套对象插入需要时间——Spring Data JPA、Hibernate 和 MySQL
【发布时间】:2018-06-27 13:39:17
【问题描述】:

我参与了需要在单个事务中持久化嵌套对象的项目。

class PurchaseOrder{
    @Id
    @GeneratedValue(strategy=strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = PurchaseOrderMaterial.class)
    @JoinColumn(name = "purchaseOrder_id")
    private List<PurchaseOrderMaterial> purchaseOrderMaterials;
    ......
    ......
}

还有 PurchaseOrderMaterial.java

class PurchaseOrderMaterial{
    @Id
    @GeneratedValue(strategy=strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = PurchaseOrderMaterialDutiesAndTax.class)
    @JoinColumn(name = "purchaseOrderMaterial_id", nullable = true)
    private List<PurchaseOrderMaterialDutiesAndTax> purchaseOrderMaterialDutiesAndTaxes;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = PurchaseOrderOtherExpenditureItem.class)
    @JoinColumn(name = "purchaseOrderMaterial_id")
    private List<PurchaseOrderOtherExpenditureItem> purchaseOrderOtherExpenditureItems;
.....
.....
}

其他两个实体(PurchaseOrderOtherExpenditureItem.java 和 PurchaseOrderOtherExpenditureItem.java)将没有子实体/关系。我从前端构图对象。在我的服务实现中,我只调用了

repo.save(purchaseOrder);

我的应用程序需要 5 秒来存储数据。 PS:以上代码为示例,实际代码可能有更多子实体。

【问题讨论】:

    标签: mysql spring hibernate jpa spring-data-jpa


    【解决方案1】:

    您的映射存在一些严重问题。这就是为什么 Hibernate 也运行许多更新查询的原因。我已经使用以下代码进行了测试。对于七个对象,它运行七个插入语句和六个更新查询。

        PurchaseOrderMaterialDutiesAndTax purchaseOrderMaterialDutiesAndTaxes = new PurchaseOrderMaterialDutiesAndTax();
        PurchaseOrderMaterialDutiesAndTax purchaseOrderMaterialDutiesAndTaxes1 = new PurchaseOrderMaterialDutiesAndTax();
    
        PurchaseOrderOtherExpenditureItem purchaseOrderOtherExpenditureItem = new PurchaseOrderOtherExpenditureItem();
        PurchaseOrderOtherExpenditureItem purchaseOrderOtherExpenditureItem1 = new PurchaseOrderOtherExpenditureItem();
    
        PurchaseOrderMaterial purchaseOrderMaterials = new PurchaseOrderMaterial();
        purchaseOrderMaterials.setPurchaseOrderMaterialDutiesAndTaxes(Arrays.asList(purchaseOrderMaterialDutiesAndTaxes, purchaseOrderMaterialDutiesAndTaxes1));
        purchaseOrderMaterials.setPurchaseOrderOtherExpenditureItems(Arrays.asList(purchaseOrderOtherExpenditureItem, purchaseOrderOtherExpenditureItem1));
    
        PurchaseOrderMaterial purchaseOrderMaterials1 = new PurchaseOrderMaterial();
        purchaseOrderMaterials.setPurchaseOrderMaterialDutiesAndTaxes(Arrays.asList(purchaseOrderMaterialDutiesAndTaxes, purchaseOrderMaterialDutiesAndTaxes1));
        purchaseOrderMaterials.setPurchaseOrderOtherExpenditureItems(Arrays.asList(purchaseOrderOtherExpenditureItem, purchaseOrderOtherExpenditureItem1));
    
        PurchaseOrder purchaseOrder = new PurchaseOrder();
        purchaseOrder.setPurchaseOrderMaterials(Arrays.asList(purchaseOrderMaterials, purchaseOrderMaterials1));
    

    您应该更改一对多映射所有者端。请看以下博客https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 2016-06-17
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多