簡體   English   中英

Spring 數據 JPA 保存時通過 id 進行多次選擇

[英]Spring Data JPA make many selects by id when save

我有這個模型:

數據模型:

@Table(name = "data_model")
public class DataModel {

    @Id
    @GeneratedValue
    @Column(name = "model_id")
    private Integer id;

    @OneToMany(orphanRemoval = true, mappedBy = "dataModel", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
    private List<OutputField> outputFields;

    @OneToMany(orphanRemoval = true, mappedBy = "dataModel", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
    private List<IncrementField> incrementFields;

}

輸出字段:

@Table(name = "data_model_output_field")
public class OutputField {

    @Id
    @GeneratedValue
    @Column(name = "output_field_id")
    private Integer id;

    @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "model_id")
    private DataModel dataModel;

}

增量字段:

@Entity
@Table(name = "data_model_increment_field")
public class IncrementField {

    @Id
    @GeneratedValue
    @Column(name = "increment_field_id")
    private Integer id;
    
    @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "model_id")
    private DataModel dataModel;
}

我有服務方法:

@Transactional
public void createOrUpdate(DataModel dataModel) {
    DataModel savedDataModel = dataModelRepository.save(dataModel);
}

當我嘗試保存實體時,在日志中我看到許多 select 查詢:

Name:test-ds, Connection:9, Time:0, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["
    select
        outputfiel0_.model_id as model_id8_4_0_
    from
        data_model_output_field outputfiel0_ 
    where
        outputfiel0_.output_field_id=1"]


Name:test-ds, Connection:9, Time:0, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["
    select
        outputfiel0_.model_id as model_id8_4_0_
    from
        data_model_output_field outputfiel0_ 
    where
        outputfiel0_.output_field_id=2"]


Name:test-ds, Connection:9, Time:0, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["
    select
        outputfiel0_.model_id as model_id8_4_0_
    from
        data_model_output_field outputfiel0_ 
    where
        outputfiel0_.output_field_id=3"]


Name:test-ds, Connection:9, Time:0, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["
    select
        outputfiel0_.model_id as model_id8_4_0_
    from
        data_model_output_field outputfiel0_ 
    where
        outputfiel0_.output_field_id=4"]

Name:test-ds, Connection:9, Time:0, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["
    select
        outputfiel0_.model_id as model_id8_4_0_
    from
        data_model_output_field outputfiel0_ 
    where
        outputfiel0_.model_id=2"]

它通過 id 獲取每個字段。 但是他為什么這樣做,他可以立即通過model_id拿起列表?

此外,在日志的最后,他做到了。 為什么他需要以前的查詢呢?

更新

復制的簡單示例: https://github.com/eaxdev/simple-web-app

那是因為save方法使用EntityManager.merge刷新更改,而您正在使用 MERGE 級聯。 我不知道您要在此處保存什么樣的 object 圖,但似乎outputFields集合有 4 個條目首先經歷 MERGE 級聯,即 Hibernate 選擇當前 Z9ED39E2EA9314586B6EZA985 的這些對象。變化。 接下來,Hibernate 嘗試刷新DataModel#outputFields關系的更改,即外鍵,它需要查詢所有對象,以便它知道要刪除什么(我認為這是由於孤立刪除而需要的)。

在我看來, OutputFieldIncrementFieldDataModel有組合關系,那么為什么不把 model 當作@Embeddable呢? 這樣,Hibernate 可以更有效地管理關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM