2017-06-09 4 views
2

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

答えて

0

JaVersがあるがstatistisをコミット:firtsで

13:27:44.315 [main] INFO org.javers.core.Javers - Commit(id:1.0, snapshots:2, author:author, changes - NewObject:2), done in 71 millis (diff:71, persist:0) 
13:27:44.333 [main] INFO org.javers.core.Javers - Commit(id:2.0, snapshots:2, author:author, changes - ListChange:1 NewObject:1), done in 17 millis (diff:17, persist:0) 
13:27:44.336 [main] INFO org.javers.core.Javers - Commit(id:3.0, snapshots:1, author:author, changes - ValueChange:1), done in 3 millis (diff:3, persist:0) 

は、我々がここで2つの新しいオブジェクトを持っているので、2つのスナップショットが作成され、コミット。 - 新しいアイテムはListChange

  • 趣味(値オブジェクト)スナップショットにリストに追加

    • ユーザ(エンティティ)スナップショット、ユーザのフィールドhobbiesが変更されるため:第別の2つのスナップショットが作成されたコミットで

      ユーザーのフィールドhobbiesが変更されていないので、それは新しいオブジェクトだから

    では、第3のコミットのみ1スナップショットは、作成されます。 JaVersは、バリューオブジェクトのコレクションとエンティティのコレクションを参照のコレクション(GlobalIdのもの)として扱います。この場合、参照は変更されません。次のようにコレクションの状態がキャプチャされます。

    ["User/John#hobbies/0", 
    "User/John#hobbies/1"] 
    

    第三の変化だけがコミット趣味のフィールドの変更(真陽性>偽)であるので、GlobalId User/John#hobbies/1とValueObject中とvalueChange

    言い換えれば、ときに一部のエンティティが所有する値オブジェクトを変更し、エンティティ状態に変更がない場合、Entityスナップショットは以前のものとまったく同じであるため作成されません。

  • +0

    ありがとう@BartekWalacik。現行の形式のJaversは、私たちのユースケースに合っていません。私の例のValueオブジェクトは、エンティティを囲まずに意味がありません。値オブジェクトの変更がエンティティスナップショットの一部であることを確認したいのですが、コレクション状態を収集するために値オブジェクトバージョンを 'ユーザー/ John#hobbies/1#v1' – Swamy

    +0

    新しいシャドウを試しましたか?影はオリジナルのオブジェクトグラフを復元しようとします。 http://javers.org/documentation/jql-examples/#query-for-shadows –

    関連する問題