2012-07-12 24 views
13

Tôi sử dụng Hibernate Envers để kiểm tra các thực thể của mình.Làm thế nào để không kiểm toán một bảng tham gia và các thực thể liên quan bằng cách sử dụng Hibernate Envers?

Tôi có một thực thể được kiểm tra, Foo, có một thuộc tính là List<Bar>. Tuy nhiên, tôi không muốn kiểm tra các đối tượng Bar. Vì vậy, tôi đã viết rằng:

@Entity 
@Audited 
public class Foo { 

    @JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID")) 
    @ManyToMany(cascade = PERSIST) 
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
    public List<Bar> getBars() { 
     return bars; 
    } 

} 

Bây giờ, tôi muốn lấy một phiên bản của Foo:

AuditReader reader = AuditReaderFactory.get(getEntityManager()); 
    Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult(); 

Thật không may, khi tôi muốn lấy tất cả các dữ liệu (tức là khi nó tải lười biếng các bars) , tôi nhận được lỗi ORA-00942: table or view does not exist, vì nó đã cố gắng để truy vấn:

select ... from T_FOO_BAR_AUD x, T_BAR y where ... 

tôi dù rằng việc sử dụng @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), Hibernate Envers sẽ tiếp tục liên kết s với các mục Bar của thực thể hiện tại.

Vậy làm cách nào để giải quyết sự cố của mình mà không phải kiểm tra rõ ràng các bảng T_BART_FOO_BAR (bảng kết nối)? Nói cách khác, khi tôi lấy danh sách bars từ thực thể sửa đổi của mình, tôi nhận được danh sách bars từ thực thể hiện tại của tôi (vì các liên kết giữa FooBar không được kiểm tra).

Cảm ơn.

Trả lời

18

Có vẻ như bạn đang sử dụng @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) khi bạn nên sử dụng @NotAudited trong trường hợp của mình.

RelationTargetAuditMode.NOT_AUDITED sẽ không chỉ kiểm tra đối tượng mục tiêu đích. Nó vẫn sẽ cố gắng kiểm tra thuộc tính List<Bar> của Foo và do đó là bảng tham gia.

Từ các tài liệu:

Nếu bạn muốn thực hiện kiểm toán một mối quan hệ, trong đó đối tượng mục tiêu là không kiểm toán (đó là trường hợp ví dụ với từ điển giống như các tổ chức, mà không thay đổi và không cần phải được kiểm tra), chỉ cần chú thích nó với @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Sau đó, khi đọc các phiên bản lịch sử của pháp nhân, quan hệ sẽ luôn trỏ đến thực thể liên quan "hiện tại".

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