2012-11-12 24 views
6

Tôi đang sử dụng Ebean và tôi cần phải kết thúc việc "xóa tầng" như DDL (ngôn ngữ định nghĩa dữ liệu) - chú thích nào thực hiện điều đó? Tôi đã thửTạo "xóa tầng" bằng cách sử dụng Ebean

nhưng điều đó cho phép "giới hạn xóa"/không thay đổi mặc định "về giới hạn xóa"?

Trả lời

1

Hãy thử điều này

@OneToMany(mappedBy = "parent", cascade = javax.persistence.CascadeType.REMOVE) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
0

Bạn cần phải sử dụng @OnDelete chú thích trên các lớp cha mẹ để cho Hibernate để tạo ra nó trong DDL (@OnDelete(action = OnDeleteAction.CASCADE))

Ví dụ:

@Entity 
class Parent { 
    /* id and some attributes */ 

    @OneToMany(mappedBy = "parent", cascade = {CascadeType.REMOVE}) 
    @ForeignKey(name = "FK_CHILD_PARENT") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    List<Child> children; 
} 

@Entity 
class Child { 
    /* id and some attributes */ 

    Parent parent; 
} 
0

Mặc dù bạn đã yêu cầu "xóa tầng thác" dưới dạng DDL, câu trả lời của tôi bao gồm cấp phần mềm. EBean dường như không tạo ra các cấp bậc DB. Thay vào đó, nó xử lý hoạt động xếp tầng trong phần mềm. Tôi nghĩ đó là một lựa chọn tốt.

Xem này từ (avaje-ebeanorm-4.6.2.jar: com/avaje/ebeaninternal/máy chủ/kéo dài/DefaultPersister)

/** 
* Delete the bean. 
* <p> 
* Note that preDelete fires before the deletion of children. 
* </p> 
*/ 
private void delete(PersistRequestBean<?> request) { 

    DeleteUnloadedForeignKeys unloadedForeignKeys = null; 

    if (request.isPersistCascade()) { 
     // delete children first ... register the 
     // bean to handle bi-directional cascading 
     request.registerDeleteBean(); 
     deleteAssocMany(request); 
     request.unregisterDeleteBean(); 
    ... 

Bạn có thể thấy rằng nếu yêu cầu là một cascade, sau đó đầu tiên con của nó bị xóa (có lẽ đây là bằng cách nào đó đệ quy).

Trong DB Postgre của tôi, các ràng buộc khóa ngoài được tạo tự động không chứa bất kỳ thác nào, nhưng vẫn hoạt động xóa được xếp chồng.