javersを評価エンティティに使用するよう評価しています。私は、Entityを持っていますValueObjects.Iの入れ子になったコレクションでは、それぞれの属性の変更は、valueobjectがEntity.Snapshotのスナップショットを生成するために生成されることを期待値オブジェクトがコレクションに追加されたときに作成されます。エンティティの2つのスナップショットを作成しました。 3回目には値オブジェクトの属性を変更したばかりですが、ジャバーはそれをエンティティの変更として認識せず、内部値オブジェクトのスナップショットを作成しました。Javersがコレクション内のオブジェクト属性の変更のスナップショットを作成していない
私の質問は、私の仮定が有効であるか、どのようなコレクション
に値オブジェクトへの変更を追跡するための最良の方法です以下は、私は春ブーツを使用して作成した簡単なテストからのコードがあるかどうかです。
私は
package com.example.javersdemo; import com.fasterxml.jackson.annotation.JsonUnwrapped; import lombok.Data; import org.javers.core.metamodel.annotation.TypeName; import javax.persistence.CollectionTable; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import java.util.List; @Data @Entity @TypeName("User") class User{ @Id private String name ; @JsonUnwrapped @ElementCollection(targetClass = Hobby.class) @CollectionTable(name = "USER_HOBBIES") @JoinColumn(name = "NAME") private List<Hobby> hobbies; private User(){ } public User(String name, List<Hobby> hobbies) { this.name = name; this.hobbies = hobbies; } }
次のバリューオブジェクトは
package com.example.javersdemo;
import lombok.Data;
import javax.persistence.Embeddable;
@Data
@Embeddable
public class Hobby {
private String hobby;
private boolean active;
private Hobby() {
}
public Hobby(String hobby, boolean active) {
this.hobby = hobby;
this.active = active;
}
}
以下のように私の春のデータリポジトリが
以下のようになっていると私のエンティティであるjaversバージョン3.2.0を使用しています
package com.example.javersdemo;
import org.javers.spring.annotation.JaversSpringDataAuditable;
import org.springframework.data.repository.CrudRepository;
@JaversSpringDataAuditable
interface TestUserRepository extends CrudRepository<User,String> {
}
以下は、コレクション内のオブジェクト属性の変更が新しいスナップショットを作成することを確認するために作成したSpock統合テストです。
package com.example.javersdemo
import org.javers.core.Javers
import org.javers.repository.jql.QueryBuilder
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import spock.lang.Specification
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class JaversInnerValueObjectsTest extends Specification {
@Autowired
TestUserRepository userRepository
@Autowired
Javers javers
def 'should create 6 snapshots'() {
given:
def hobbies = [new Hobby('Reading books', true)]
def user = new User('John', hobbies)
when:
userRepository.save(user)
hobbies = [new Hobby('Reading books', true), new Hobby('Watching Soccer', true)]
user.hobbies = hobbies
userRepository.save(user)
hobbies = [new Hobby('Reading books', true), new Hobby('Watching Soccer', false)]
user.hobbies = hobbies
userRepository.save(user)
then:
QueryBuilder jqlQuery = QueryBuilder.byInstanceId('John', User)
def snapshots = javers.findSnapshots(jqlQuery.withChildValueObjects().build())
snapshots.size() == 6
}
}
とテストは以下のエラーで失敗し
条件不成立:
snapshots.size()== 6 | | | | 5 false スナップショット{コミット:2.0、ID:User/John#hobbies/1、 [スナップショット{コミット:3.0、ID:ユーザー/ John#hobbies/1、バージョン:2、 (趣味:サッカー観戦)}、 ユーザー/ John、バージョン:2、(趣味:[User/John#hobbies/0、 ユーザー/ John#、バージョン:1、アクティブ:true、趣味:Watching Soccer)}、スナップショット{コミット:2.0、 id: (コミット:1.0、 id:User/John#hobbies/0、バージョン:1、アクティブ:true、趣味:読書 )}、スナップショット{コミット:1.0 、ID:ユーザー/ジョン・バージョン:1、 (趣味:[ユーザー/ジョン#趣味/ 0]、名:ジョン)}]予想
:6
Actua L:ログで5
ありがとう@BartekWalacik。現行の形式のJaversは、私たちのユースケースに合っていません。私の例のValueオブジェクトは、エンティティを囲まずに意味がありません。値オブジェクトの変更がエンティティスナップショットの一部であることを確認したいのですが、コレクション状態を収集するために値オブジェクトバージョンを 'ユーザー/ John#hobbies/1#v1' – Swamy
新しいシャドウを試しましたか?影はオリジナルのオブジェクトグラフを復元しようとします。 http://javers.org/documentation/jql-examples/#query-for-shadows –