2014-05-02 37 views
0

我在處理表單中的繼承模型時遇到了問題。這裏有一個簡單的例子來理解我的問題。在Teamplate中使用繼承的Play Framework 2.2

類User有兩個子類Employee和Admin。

User.java

@Entity 
@MappedSuperclass 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type") 
public class User extends Model { 
... 
} 

Employee.java

@Entity 
@DiscriminatorValue("employee") 
public class Employee extends User{ 
    ... 
} 

Admin.java

@Entity 
@DiscriminatorValue("admin") 
public class Admin extends AnalysisProcedure { 
... 
} 

現在我想的屁股將多個用戶關聯到具有列表的項目。該列表應該包含員工或管理員的對象。

Project.java

@Entity 
public class Project extends Model { 

public List<User> users; 

} 

Web界面是這樣產生的:

@repeat(projectForm("users")) { user => 
    <tr> 
     <td> 
      @inputText(user("name")) 
     </td> 
     ... 
    <tr> 
} 

表演沒有顯示任何錯誤提交,也沒有新的目標是保持在數據庫中。在調試代碼時,我看到新用戶的實例是User。

Projets.java(控制器)

... 
Project project = formProject.get(); 
List<User> users = project.users; 

for(User user : users){ 
    // the user is everytime instance of User 
} 
... 

現在我的問題是如何處理這種傳承的Web界面,所以員工或管理員可以添加到數據庫中?

回答

0

這是有點問題,但您使用的是IE List<User>,爪哇將其識別爲Employee一個實例,所以你需要EmployeeUser(用於關係保存這是不夠的,如果該對象包含id場只。

對於在Ebean節約的關係,我們創建了簡單的User模型鑄造方法非常類似的問題,不是非常好的反正按預期工作:

public User asUser() { 
    User user = new User(); 
    user.id = this.id; 
    return user; 
} 

案例:

Employee employee = Employee.find.byId(123); 

// This doesn't work: 
project.users.add(employee); 


// This works: 
project.users.add(employee.asUser()); 
相關問題