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 模块有额外的列的主要内容,如果未能解决你的问题,请参考以下文章
与 Play Framework 1.2.5 JPA 的多对多关系