[英]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
拿起列表?
此外,在日志的最后,他做到了。 為什么他需要以前的查詢呢?
更新:
那是因為save
方法使用EntityManager.merge
刷新更改,而您正在使用 MERGE 級聯。 我不知道您要在此處保存什么樣的 object 圖,但似乎outputFields
集合有 4 個條目首先經歷 MERGE 級聯,即 Hibernate 選擇當前 Z9ED39E2EA9314586B6EZA985 的這些對象。變化。 接下來,Hibernate 嘗試刷新DataModel#outputFields
關系的更改,即外鍵,它需要查詢所有對象,以便它知道要刪除什么(我認為這是由於孤立刪除而需要的)。
在我看來, OutputField
和IncrementField
與DataModel
有組合關系,那么為什么不把 model 當作@Embeddable
呢? 這樣,Hibernate 可以更有效地管理關聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.