2011-11-11 36 views
6

Tôi đang cố gắng hiểu làm thế nào để thừa kế hoạt động! Nhưng không thành công.Làm thế nào để kế thừa một mô hình từ siêu lớp trong playframework

Vì vậy, tôi có cha như vậy:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
abstract class SuperClass extends Model { 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "SEQ_TABLE") 
    @TableGenerator(name = "SEQ_TABLE") 
    Long id; 

    int testVal; 
} 

Và 2 lớp kế thừa:

@Entity 
public class Sub extends SuperClass {   
    String name; 

    @Override 
    public String toString() { 
      return name; 
    } 
} 

@Entity 
public class Sub1 extends SuperClass {   
    String name; 

    @Override 
    public String toString() { 
      return name; 
    } 
} 

Ngoài ra tôi có 2 bộ điều khiển cho các lớp kế thừa:

public class Subs and Sub1s extends CRUD { 

} 

Sau khi ứng dụng được khởi động , Tôi nhận được 2 bảng trong MySQL db cho các mô hình của tôi (Sub và Sub1) với cấu trúc như vậy: id bigint (20), tên varchar (255). Không có testVal nằm trong siêu lớp.

Và khi tôi cố gắng tạo ra đối tượng mới của Sub lớp trong giao diện CRUD Tôi nhận lỗi như vậy: lỗi Thực hiện xảy ra trong mẫu {module: crud} /app/views/tags/crud/form.html. Ngoại lệ được nâng lên là MissingPropertyException: Không có thuộc tính như vậy: testVal cho lớp: models.Sub.

Trong {module: crud} /app/views/tags/crud/form.html (khoảng dòng 64) # {crud.numberField tên: field.name, giá trị: (currentObject currentObject [field .name]: null) /}

  1. Tôi nên làm gì để tạo bảng MySQL cho mô hình kế thừa đúng cách và sửa lỗi?
  2. Có thể có một superController đơn cho một số lớp được kế thừa không?
+1

lưu ý rằng bạn khai báo các trường của mình bằng công cụ sửa đổi truy cập mặc định. Thay đổi nó thành công cộng để chơi PropertiesEnhaner có thể thực hiện công việc của nó. – sdespolit

+0

Cảm ơn bạn. Tôi đã thêm quyền truy cập công khai vào 'Dài id' và' int testVal'. Bây giờ tôi có thể thấy trường testVal trong giao diện CRUD và có thể lưu mô hình mà không có lỗi. Nhưng vẫn không có trường nào trong MySql, vì vậy tôi không thể lưu giá trị này. Tôi tin rằng tôi nên thêm một số chú thích vào giá trị này, nhưng cái gì? – gl0om

+0

Cuối cùng, tôi đã tìm ra giải pháp: Tôi vừa thêm '@ MappedSuperclass' vào' SuperClass' và xóa 'Long id' khỏi nó. ** sdespolit **, cách chấp nhận đề xuất của bạn để thêm công cụ truy cập công khai? Tôi không thể tìm thấy bất kỳ nút chấp nhận nào. – gl0om

Trả lời

2

Vâng, nhờ sdespolit, tôi đã thực hiện một số thử nghiệm. Và đây là những gì tôi đã có:

lớp cha:

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class SuperClass extends Model { 
} 

thừa kế lớp:

@Entity 
public class Sub extends SuperClass { 
} 

"Super trình điều khiển" Tôi đã thực hiện theo cách như vậy:

@With({Secure.class, SuperController.class}) 
@CRUD.For(Sub.class) 
public class Subs extends CRUD { 
} 

@With({Secure.class, SuperController.class}) 
@CRUD.For(Sub1.class) 
public class Sub1s extends CRUD { 
} 

@ CRUD.For (Sub.lớp) được sử dụng để báo cho máy bay đánh chặn với những gì lớp nó cũng làm việc

public class SuperController extends Controller { 

    @After/Before/Whatever 
    public static void doSomething() { 
     String actionMethod = request.actionMethod; 
     Class<? extends play.db.Model> model = getControllerAnnotation(CRUD.For.class).value(); 

     List<String> allowedActions = new ArrayList<String>(); 
     allowedActions.add("show"); 
     allowedActions.add("list"); 
     allowedActions.add("blank"); 

     if (allowedActions.contains(actionMethod)) { 
      List<SuperClass> list = play.db.jpa.JPQL.instance.find(model.getSimpleName()).fetch(); 
     } 
    } 
} 

Tôi không chắc chắn về doSomething() cách tiếp cận thực sự thoải mái và Java-style/Play! -kiểu. Nhưng nó làm việc cho tôi. Xin vui lòng cho tôi biết nếu nó có thể để bắt ra lớp của mô hình theo cách bản địa hơn.

1

"và bảng trên mỗi lớp là tính năng tùy chọn của thông số JPA, vì vậy không phải tất cả nhà cung cấp đều có thể hỗ trợ" từ WikiBook.

Tại sao bạn không sử dụng @MappedSuperclass? Hơn nữa bạn nên mở rộng GenericModel. Trong ví dụ của bạn, bạn đã xác định id hai lần, điều này cũng có thể là lý do của bạn.

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