我是新來的Stackoverflow,所以我會盡我所能去符合用法。我想知道是否有辦法獲得給定實體的更改/快照的完整列表。目前,它適用於Singular Properties版本,以及對收集財產的添加和刪除。但是我無法找到Collection Property中的子實體何時更新。JaVers,SpringDatat,JPA:查詢集合中的實體更新
給定兩個實體,和LinkEntity:
@Entity
class Person {
@Id
Long id;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
Set<LinkAddress> addresses;
}
@Entity
class Address {
@Id
Long id;
@OneToMany(mappedBy = "address")
Set<Address> persons;
}
@Entity
class LinkPersonAddress {
@Id
Long id;
@ManyToOne
@ShallowReference
Person person;
@ManyToOne
@ShallowReference
Address address;
String linkType;
}
我的使用情況如下。我通過ID#1獲得了一個特定的人,然後改變了特定地址的類型(即。HOME - > WORK)。我用修改後的Set保存Person,讓JPA級聯我的更改。雖然所有的Spring人員,地址和LinkPersonAddress Spring數據存儲庫都使用@JaversSpringDataAuditable進行了註釋,但我無法使用Javers QueryBuilder和Person和Id#1來檢索此「更新」。這是有道理的,因爲我應該查詢類LinkPersonAddress,但是我怎樣才能指定我只需要LinkPersonAddress與ID爲1的Person相關的更改。
PS:請道歉代碼片段中的任何拼寫錯誤,因爲我沒有寫在我的開發環境中。
我聽你的,但可能我的例子(這是不是我的實際使用情況)還不夠好。假設我們有學生,課程和LinkTable類型(Auditor,Enrolled)。我想完整記錄給定課程(全部更新課程屬性),並以某種方式彙總給定學生包容性註冊的完整歷史記錄。那麼你是說LinkTable本身應該是ValueObject,即使從JPA的角度來看它也必須用@Entity來註釋?首次配置Javers時,使用自定義ValueObject映射來使用JPA Annotation? –
我按照您的建議進一步嘗試了一下,使鏈接成爲一個有價值的對象,但後來我嘗試更新一個學生,其中包含兩門課程,即作爲審覈員的課程1和已註冊的課程2。我想將第二個鏈接切換到Auditor,並且我得到了Change,ValueRemoved(oldLink)和ValueAdded(newLink),每個引用不同的globalId,儘管我只更新了鏈接(JPA Id保持穩定)。我認爲我的鏈接有其自己的身份,雖然由其父「擁有」。我們處於混合狀態嗎? –
在Javers查詢(JQL)中,實體之間沒有完整的連接。你可以做什麼,是使用ChildValueObjects過濾器將ValueObjects連接到其擁有的實體。 另一種選擇是Shadow查詢,請參閱https://javers.org/documentation/jql-examples/#query-for-shadows 帶範圍COMMIT的影子查詢,可以執行實體連接,但有一些限制。我要寫一篇小文章來展示它的工作原理 –