2017-12-13 1 views
0

이 디자인 패턴을 구현하려면 다큐멘터리 제안이나 sudo 코드 또는 링크가 필요합니다. 필자는 테이블의 모든 열을 나타내는 Entity (Pojo) 클래스를 작성했습니다. 내 요구 사항 몇 가지 디자인 솔루션을 쓰고 싶습니다. 그래서 여러 변경 사항이 발생하면 해당 엔티티의 모든 이전 값을 추적 할 수 있어야합니다.Java에서 Entity Class 객체의 이전 값을 모두 가져 오는 데 필요한 디자인 솔루션

+0

처럼 보일 수 있습니다 database-auditing-jpa. –

+0

예. 이것이 내가해야 할 일입니다. 하지만, 어떤 절전/JPA 관련 API를 사용하지 않고 .. 내가 그것을 간단한 핵심 자바 모듈을 사용하여 작성해야합니다. 그것을 디자인하는 방법은 무엇이 있어야합니까 ??? –

답변

0

최대 절전 모드와 같은 프레임 워크를 사용하는 것이 좋습니다.

프레임 워크를 사용할 수없는 경우 @PrePersist@PreUpdate을 사용하여 기록 추적을 구현할 수 있습니다. 기업은 @PrePersist@PreUpdate

  • 에 변경된 경우 기록 항목을 만들 필요

    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; 
        } 
    } 
    

    (210) 및 PersonHistory 당신은 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; 
        } 
    } 
    
  • 관련 문제