2017-12-13 8 views
0

この設計パターンを実装するには、ドキュメンタリーの提案やsudoコードまたはリンクが必要です。私はテーブルのすべての列を表すEntity(Pojo)クラスを作成しました。私の要求いくつかの設計ソリューションを書こうと思っています。そのため、複数の変更が発生した場合、そのエンティティのすべての以前の値を追跡できるはずです。JavaでEntity Classオブジェクトの以前の値をすべて取得するために必要な設計ソリューション

+0

のようになります。 database-auditing-jpaです。 –

+0

これは私がする必要があるものです。しかし、任意の休止状態/ jpa関連apisを使用せずに..私はそれをシンプルなコアのJavaモジュールを使用して記述する必要があります。それを設計するためのアプローチは何ですか? –

答えて

0

私は休止状態のようなフレームワークを使用することをお勧めします。

フレームワークを使用できない場合は、@PrePersistと​​を使用して履歴トラッキングを実装することができます。エンティティは@PrePersistと​​

  • に変更された場合の履歴エントリを作成する必要があれば

    1. エンティティが実際の状態セーブ・ロードされると

      https://stackoverflow.com/a/19313914/974186

    2. チェックを参照してください

    たとえば

    @Entity 
    public class Person implements Serializable { 
    
        @Id 
        private Integer id; 
    
        private String firstname; 
    
        private String lastname; 
    
        /** 
        */ 
        @OneToMany(mappedBy = "person", fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) 
        private List<PersonHistory> personHistories = new ArrayList<>(); 
    
        @Transient 
        private transient Person previousPersonState; 
    
        protected Person() { 
        // JPA only 
        } 
    
        public Person(String firstname, String lastname) { 
        this.firstname = firstname; 
        this.lastname = lastname; 
        } 
    
        @PostLoad 
        private void saveState() { 
        this.previousPersonState = SerializationUtils.clone(this); // from apache commons-lang 
        } 
    
        @PrePersist 
        @PreUpdate 
        private void updateHistory() { 
        if (personChanged()) { 
         PersonHistory personHistory = new PersonHistory(previousPersonState); 
         personHistories.add(personHistory); 
        } 
        } 
    
        public boolean personChanged() { 
        if (previousPersonState == null) { 
         return false; 
        } 
    
        if (getFirstname() != null ? !getFirstname().equals(previousPersonState.getFirstname()) : previousPersonState.getFirstname() != null) 
         return false; 
        if (getLastname() != null ? !getLastname().equals(previousPersonState.getLastname()) : previousPersonState.getLastname() != null) 
         return false; 
        return true; 
        } 
    
        public String getFirstname() { 
        return firstname; 
        } 
    
        public String getLastname() { 
        return lastname; 
        } 
    } 
    

    とPersonH​​istoryはあなたがhttp://hibernate.org/orm/envers/を見てみたいとhttp://www.baeldung.com/かもしれません。この

    @Entity 
    public class PersonHistory { 
    
        @Id 
        private Integer id; 
    
        @ManyToOne(fetch = FetchType.LAZY, optional = false) 
        @JoinColumn(nullable = false) 
        private Person person; 
    
        private String firstname; 
        private String lastname; 
    
        private Date createdDate; 
    
        protected PersonHistory(){ 
        // default constructor for JPA  
        } 
    
        public PersonHistory(Person person) { 
        this.person = Objects.requireNonNull(person); 
    
        this.firstname = person.getFirstname(); 
        this.lastname = person.getLastname(); 
    
        createdDate = new Date(); 
        } 
    
        public Date getCreatedDate() { 
        return createdDate; 
        } 
    
        public String getFirstname() { 
        return firstname; 
        } 
    
        public String getLastname() { 
        return lastname; 
        } 
    } 
    
  • 関連する問題