playframework - 多对多,使用 crud 模块有额外的列

Posted

技术标签:

【中文标题】playframework - 多对多,使用 crud 模块有额外的列【英文标题】:playframework - many to many with extra columns using the crud module 【发布时间】:2014-09-18 09:02:11 【问题描述】:

假设我有一个员工类和一个项目类,我想将多个(多选)员工分配给一个项目并在连接表中有额外的列“通知”,我尝试了该方法显示 here,但没有为我工作。

这是我的课程(我非常确定的课程)

Employee.java

class Employee extends Model
    //Some properties
  .....
 

项目.class

 class Project extends Model
    //Some properties
    ......

    @ManyToMany
    public List<Employee> assignedEmp;
 

我正在使用 playframework 1.2.5.3 和 crud 模块。

crud 模块是否可以开箱即用?

非常感谢这里的任何帮助。 我完全迷路了。

【问题讨论】:

【参考方案1】:

在游戏框架中解决您的问题并不容易,但可以通过一些工作来解决。 首先,您应该使用您需要的附加属性以及从员工和项目 ID 构建的复合 ID 键来定义 JoinModel。 CRUD 不喜欢复合键,那么你应该覆盖这个模型的_key()findById() 方法。 最后你需要在这个模型的 crud 控制器中覆盖 show() 方法。

@Entity
public class Project extends Model 
    public String name;

    @OneToMany(mappedBy = "project")
    public List<ProjectEmployee> projectEmployees = new ArrayList<ProjectEmployee>();

    @Override
    public String toString() 
      return name;
    



@Entity
public class Employee extends Model 
    public String name;

    @OneToMany(mappedBy = "employee")
    public List<ProjectEmployee> projectEmployees = new ArrayList<ProjectEmployee>();

    @Override
    public String toString() 
      return name;
    


@Entity
    @Table(name = "project_employee")
    public class ProjectEmployee extends GenericModel 


    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "project_id", insertable = false, updatable = false)
    public Project project;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id", insertable = false, updatable = false)
    public Employee employee;

    public boolean notified = false;

    public String _key() 
        try 
            return project.id + "-" + employee.id;
         catch (NullPointerException npe) 
            return "0-0";
        
    

    @Override
    public String toString() 
        StringBuilder sb = new StringBuilder("ProjectEmployee[");
        if (project != null) sb.append(project.name).append("-");
        if (employee != null) sb.append(employee.name);
        sb.append("]");
        return sb.toString();
    

    public static ProjectEmployee findById(String id) 
        String[] elements = id.split("-");
        int projectId = Integer.valueOf(elements[0]);
        int employeeId = Integer.valueOf(elements[1]);

        return ProjectEmployee.find("project_id=? AND employee_id=?", projectId, employeeId).first();
    

和控制器:

@CRUD.For(ProjectEmployee.class)
public class ProjectEmployees extends CRUD 

/**
 * CRUD show method doesn't know how to handle composite ids.
 *
 * @param id composite of ssn + "-" + accountId
 * @throws Exception
 */
public static void show(String id) throws Exception 
    // Do not rename 'type' or 'object'
    ObjectType type = ObjectType.get(getControllerClass());
    notFoundIfNull(type);
    ProjectEmployee object = ProjectEmployee.findById(id);
    notFoundIfNull(object);
    render("CRUD/show.html", type, object);




工作示例存储库hosted at bitbucket

【讨论】:

以上是关于playframework - 多对多,使用 crud 模块有额外的列的主要内容,如果未能解决你的问题,请参考以下文章

PlayFramework中模型之间的“双重”多对多关系

与 Play Framework 1.2.5 JPA 的多对多关系

具有多对多关系的核心数据 - 在 SUBQUERY 中使用 ALL 创建 NSPredicate

多对多的 Symfony2 DQL 更新查询

实体框架 CTP5,代码优先。多对多级联删除

在 TypeORM 与 GraphQL 的多对多关系上使用数据加载器,查询多对多