2011-11-23 40 views
8

Tôi đang cố gắng thiết lập kiểm toán cho dự án của chúng tôi. Tôi bắt đầu từ cấu hình mặc định hoạt động tốt.Tạo đối tượng sửa đổi tùy chỉnh Envers

Bước tiếp theo là lưu trữ người dùng đã thực hiện thay đổi. Tiếp theo hướng dẫn Tôi tạo ra phiên bản thực thể tùy chỉnh:

package com.csbi.samples.utils.audit; 

import java.io.Serializable; 
import java.text.DateFormat; 
import java.util.Date; 

import org.hibernate.envers.RevisionNumber; 
import org.hibernate.envers.RevisionTimestamp; 
import org.hibernate.envers.RevisionEntity; 

import javax.persistence.Id; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.persistence.Transient; 

@Entity 
@Table(name="REVISIONS") 
@RevisionEntity(CustomRevisionListener.class) 
public class CustomRevisionEntity implements Serializable { 
private static final long serialVersionUID = -1255842407304508513L; 

@Id 
@GeneratedValue 
@RevisionNumber 
private int id; 

@RevisionTimestamp 
private long timestamp; 

private String username; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

@Transient 
public Date getRevisionDate() { 
    return new Date(timestamp); 
} 

public long getTimestamp() { 
    return timestamp; 
} 

public void setTimestamp(long timestamp) { 
    this.timestamp = timestamp; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public boolean equals(Object o) { 
    if(this == o) return true; 
    if(!(o instanceof CustomRevisionEntity)) return false; 

    CustomRevisionEntity that = (CustomRevisionEntity) o; 

    if(id != that.id) return false; 
    if(timestamp != that.timestamp) return false; 
    if(timestamp != that.timestamp) return false; 
    if(username != that.username) return false; 

    return true; 
} 

public int hashCode() { 
    int result; 
    result = id; 
    result = 31 * result + (int) (timestamp^(timestamp >>> 32)); 
    return result; 
} 

public String toString() { 
    return "DefaultRevisionEntity(user = " + username + "id = " + id + ", revisionDate = " + DateFormat.getDateTimeInstance().format(getRevisionDate()) + ")"; 
} 

}

Và cũng tùy người nghe:

package com.csbi.samples.audit; 
import org.hibernate.envers.RevisionListener; 

public class CustomRevisionListener implements RevisionListener { 

public void newRevision(Object revisionEntity) { 
    CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity; 
    revision.setUsername("username"); //for testing 
} 

} 

Dưới đây là một số dòng từ nhật ký:

DEBUG: org .hibernate.envers.configuration.metadata.AuditMetadataGenerator - Tạo đầu tiên-p bản đồ kiểm toán ass cho thực thể com.csbi.samples.domain.Property.
DEBUG: org.hibernate.envers.configuration.metadata.AuditMetadataGenerator - Tạo ánh xạ kiểm tra thứ hai cho thực thể com.csbi.samples.domain.Property.
INFO: org.hibernate.cfg.HbmBinder - lớp Mapping: com.csbi.samples.domain.Property_AUD -> PROPERTIES_AUD
INFO: org.hibernate.cfg.HbmBinder - lớp Mapping: org.hibernate.envers. DefaultRevisionEntity -> REVINFO

Hãy xem dòng cuối cùng của đầu ra. Vẫn còn DefaultRevisionEntity được ánh xạ thay vì CustomRevisionEntity.

Tôi không biết có gì sai. Bất kỳ đề xuất?

+0

Bây giờ ... làm thế nào để đặt "tên người dùng" cho một cái gì đó có ý nghĩa ... Tôi không thể có được quyền đó vì tôi không biết ai đang sửa đổi ?! –

+0

sử dụng biến tĩnh để tiêm nếu bạn sử dụng lò xo hoặc nhà máy dịch vụ nếu bạn sử dụng đường may. https://209.132.182.48/message/641790. Hy vọng rằng sẽ giúp. – Vyacheslav

Trả lời

1

Đã giải quyết. Thực thể không được quét bởi thư mục Hibernate.

+1

bạn có thể chia sẻ không. làm thế nào bạn đạt được điều này và những gì bạn có nghĩa là bởi thực thể không phải là trong quét bởi Hibernate thư mục. Bởi vì trong thực thể dự án khác của tôi đang làm việc tốt nhưng không phải là một –

+1

Có một danh sách các gói trong cấu hình ngủ đông hoặc trong phần ngủ đông của cấu hình mùa xuân mô tả trong đó thư mục hibernate tìm kiếm một thực thể. Thực thể được mô tả ở trên không nằm trong thư mục đó. – Vyacheslav

+1

Cảm ơn, điều này đã giúp, tôi cũng quên thêm thực thể vào Hibernates 'SessionFactory' :) – reap

Các vấn đề liên quan