Вставка вложенных объектов занимает много времени - данные пружин JPA, Hibernate и MySQL - PullRequest
0 голосов
/ 27 июня 2018

Я участвовал в проекте, где мне нужно сохранить вложенный объект в одной транзакции.

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;
    ......
    ......
}

And 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: приведенный выше код является примером фактического кода может иметь больше дочерних объектов.

1 Ответ

0 голосов
/ 27 июня 2018

Ваше отображение имеет некоторые серьезные проблемы. Вот почему 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...