Play-2.2示例@ManyToMany Relationship Java

时间:2014-05-15 23:08:23

标签: java playframework playframework-2.0

我无法在Java中找到与Play-2.2设计ManyToMany关系的完整示例。 我的问题是,我无法使用Form-to-Model绑定来处理我的ManyToMany关系......

有很多用户。用户可以有很多工作。 有很多工作。工作可以“拥有”许多成员/参与者(用户)。

Job.java

@Entity
public class Job extends TimmeeyModel {

@Constraints.Required
@Column(unique = true)
public String jobName;


@ManyToMany(mappedBy="jobs")
public List<User> members = new ArrayList<User>();

public static Finder<Long,Job> find = new Finder<Long, Job>(Long.class,Job.class);

@Override
public Job create(){
    this.save();
    return this;
}

@Override
public Job update(Long id){
    Job oldJob = find.byId(id);
    oldJob.setJobName(this.getJobName());
    oldJob.setMembers(this.getMembers());
    oldJob.save();
    oldJob.refresh();
    return oldJob;
}
@Override
public void delete(){
    this.delete();
}


public String toString(){
    String userString ="";
    for (User user : members) {
        userString+=user.getUsername() +", ";
    }
    return jobName + ", " + id +" " + userString;
}

}

User.java

@Entity
public class User extends TimmeeyModel {

@Constraints.Required
@Column(unique = true)
public String username;
@ManyToMany(cascade=CascadeType.PERSIST)
public List<Job> jobs = new ArrayList<Job>();




public static Finder<Long, User> find = new Finder<Long, User>(Long.class, User.class);


public String getEmail(){
    return this.username + "@pool.math.tu-berlin.de";
}

@Override
public User create(){
    //jobs.add(Job.find.all().get(0));
    this.save();
    return this;
}

@Override
public  User update(Long id){
    User user = find.ref(id);
    user.setUsername(this.getUsername());
    user.setUsername(this.getUsername());
    user.save();
    user.refresh();
    return user;
}

public void delete(){
    this.delete();
}


public String toString(){
    String jobString = "";
    for (Job job : jobs) {
        jobString += job.toString() + ", ";

    }
    return "User Id: " + id + " "+username + "Jobs: " + jobString;
}

UserController.java

    public static Result  showCreate(){
    return ok(views.html.user.add.render(Job.find.all(), userForm));
}

public static Result create(){
    Map<String, String> newData = new HashMap<String, String>();
    Form<User> filledForm = userForm.bind(newData);
      if(filledForm.hasErrors()) {
        return badRequest("Leider nein" + filledForm.toString());
      } else {
        String logString = filledForm.toString();
        User user = filledForm.get();
        user.create();
        return ok(user.toString() + logString);  
      }
}

视图scala模板

@form(routes.Users.create()) {
 @inputText(userForm("username"))
@for((value,index) <- jobs.zipWithIndex ) {
    <input type="checkbox" name="jobs[]"     value="@value.getId()">@value.getJobName()</input>
}

我无法让它发挥作用。提交用户的Joblist后保持空白。但是当我在用户对象中设置“硬编码”列表时,它会保持在那里并且按预期工作。所以我认为它与某些db / config问题无关。我怀疑将表单数据绑定到用户模型时出现了问题。 我也尝试过不同版本的表格 @ value.getJobName() @ value.getJobName() @ value.getJobName() @ value.getJobName()

没有任何作用。所以,任何人都知道我做错了什么,或者我不知道怎么玩!?如果不在每个我想处理具有manyToMany关系的模型的Controller中编写巨大的样板代码代码,也许不可能做到这一点? 因为我知道我可以“手动”解析控制器中的表单数据并强制将jobs-List放入用户。但这对于像Play这样的MVC框架来说不是正确的方法: - )

谢谢

顺便说一句,在Play-Documentation / GitHub中甚至没有一个例子/样本,其中出现“ManyToMany”一词......

真的,我只是需要一些不完全性交的方式来处理ManyToMany关系(如果我不能使用复选框..好吧,如果我应该使用别的东西,好的....我只需要一些方法让它工作)

1 个答案:

答案 0 :(得分:0)

我自己回答了这个问题。简而言之:玩游戏是不可能的!将对象从其标识符自动绑定到列表。

也许您会阅读有关自定义Databinder或一些神奇形式助手的内容。

如果要获取映射的SINGLE复杂对象

,则CustomDatabinder很好

User.java

public Job mainJob;

如果您现在在“用户”表单中输入作业的ID,则自定义数据仓可以绑定数据(如果您提供了数据)。 但这不适用于List

实际上唯一的事情是使用一些样板代码。

我这样做了

User user = filledForm.get();
        List<Job> jobs = new ArrayList<Job>();
        for (Job job : user.getJobs()) {
            jobs.add(Job.find.byId(job.getId()));
        }
        user.create();

表单活页夹将为用户中的作业列表生成作业列表。但是这些工作只是“存根”,我已经迭代了生成的工作,并通过在数据库中搜索它们来构建一个真实的列表。

它不漂亮,但也不太难看。

也许这种解释可以帮助别人。