我有 2 個用 JPA 映射的物體
@Entity
class Table_A {
@Id
private Integer id;
@Enumerated(EnumType.STRING)
private ModuleType module;
private String name;
private Instant lastModifiedDate;
private String creator;
@NotNull
@Enumerated(EnumType.STRING)
private State state;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumns( value = {
@JoinColumn(name="id_object", referencedColumnName = "id_entity", insertable = false, updatable = false),
@JoinColumn(name="object_sub_type", referencedColumnName = "object_sub_type", insertable = false, updatable = false),
}, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private List<AttributeValue> attributes;
}
@Entity
Class Table B {
@Id
private Integer id;
@Column(name = "id_create_user", insertable = false, updatable = false)
private String createUser;
@Column(name = "type_object", insertable = false, updatable = false)
private String typeObject;
@Column(name = "id_object", insertable = false, updatable = false)
private Integer idTable_A;
@Column(name = "name")
private String name;
private Boolean hasCombination;
}
物體不相關。而且我每個人都有一個 JPARepository 介面。
@Repository
public interface Table_A_Repository extends JpaRepository<Table_A, Integer>
@Repository
public interface Table_B_Repository extends JpaRepository<Table_B, Integer>
當我有 2 個執行緒時。
第一個執行緒_1讀取“Table_A”的一個物件做一些操作,修改table_A物件的一個??欄位
第二個 Thread_2 從 Table_A 讀取相同的物件,并在 Thread_1 完成之前對 Table_B 的不同行( Table_B_Repository.saveAll( listOfTable_Bobjects) )進行更改。
我看到 Thread_2 覆寫了 Table_A 物件中 Thread_1 的變化。
我不明白的是為什么在 table_A 中呼叫 Table_B_Repository.saveAll 并更新會覆寫第一個執行緒中設定的值,保持原樣。
感謝您的回復或評論。
uj5u.com熱心網友回復:
此實作的問題在于,當您嘗試通過 saveall 方法更新時,您將擁有物件中的所有資料。
因此,如果您按名稱讀取資料,那么對于某個名稱,大約有 4 個物件,并且您只更新最后一個物件,但是在保存時,您不是只保存該物件,而是保存您已閱讀的所有物件之前。
在休眠中,如果資料發生了一些變化,那么它只會更新資料庫中的資料,因此對于由執行緒 A 更新的物件,執行緒 B 將考慮更新,并且執行緒 A 所做的所有更改都將被覆寫.
uj5u.com熱心網友回復:
存盤庫上的 saveAll 方法將保存新記錄,如果不是新記錄則合并。所以如果你saveAll所有的記錄,被執行緒1改變的記錄會在持久化背景關系中被merge()覆寫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318862.html
上一篇:在執行com.android.build.gradle.internal.tasks.Workers$ActionFacade>Android資源鏈接失敗時發生故障?
