Java 使用Play框架的OneToMany关系和表单保存
我是Play框架的初学者,在将表单数据保存到两个不同的表时遇到一些困难 当我提交表单时,firstName、lastName和text都会保存到数据库中,但我似乎无法找到为什么schoolName不会保存到schools表中。我花了相当多的时间看教程和阅读其他人的示例代码,但还没有看到解决方案。如果有人能帮我,我会非常感激 以下是我所拥有的: 候选模型:Java 使用Play框架的OneToMany关系和表单保存,java,model,playframework,Java,Model,Playframework,我是Play框架的初学者,在将表单数据保存到两个不同的表时遇到一些困难 当我提交表单时,firstName、lastName和text都会保存到数据库中,但我似乎无法找到为什么schoolName不会保存到schools表中。我花了相当多的时间看教程和阅读其他人的示例代码,但还没有看到解决方案。如果有人能帮我,我会非常感激 以下是我所拥有的: 候选模型: package models; import java.util.ArrayList; import java.util.List; im
package models;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import play.db.ebean.Model;
@Entity
public class Candidate extends Model {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
public String firstName;
public String lastName;
public boolean sponsorshipStatus;
public boolean proceedToInterview;
public String text;
@OneToMany(mappedBy="candidate", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private List<School> schools = new ArrayList<School>();
/**
* Generic query helper for entity Candidate with id Long
*/
public static Model.Finder<Long, Candidate> find = new Model.Finder<Long, Candidate>(
Long.class, Candidate.class);
}
封装模型;
导入java.util.ArrayList;
导入java.util.List;
导入javax.persistence.CascadeType;
导入javax.persistence.Entity;
导入javax.persistence.FetchType;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.OneToMany;
导入play.db.ebean.Model;
@实体
公共类候选扩展模型{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长id;
公共字符串名;
公共字符串lastName;
公共赞助地位;
公共布尔过程交互;
公共字符串文本;
@OneToMany(mappedBy=“candidate”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私立学校列表=新建ArrayList();
/**
*id为Long的实体候选的通用查询帮助程序
*/
public static Model.Finder=new Model.Finder(
长类,候选人类);
}
学校模式:
package models;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import play.db.ebean.Model;
@Entity
public class School extends Model {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
public String schoolName;
@ManyToOne(cascade=CascadeType.ALL)
public Candidate candidate = new Candidate();
/**
* Generic query helper for entity Company with id Long
*/
public static Model.Finder<Long, School> find = new Model.Finder<Long, School>(
Long.class, School.class);
}
封装模型;
导入javax.persistence.CascadeType;
导入javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.manytone;
导入play.db.ebean.Model;
@实体
公营学校扩展模式{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长id;
公共字符串学名;
@多通(级联=级联类型.ALL)
公开候选人=新候选人();
/**
*id为Long的实体公司的通用查询帮助程序
*/
public static Model.Finder=new Model.Finder(
长时间上课,学校上课);
}
表单模板:
@(candidateForm: Form[Candidate])
@import helper._
@main("Create Candidate"){
<h1>Add a Candidate</h1>
@form(routes.Application.save()) {
<fieldset>
${candidateForm("firstName")}
@inputText(candidateForm("firstName"), '_label -> "First Name")
@inputText(candidateForm("lastName"), '_label -> "Last Name")
@inputText(candidateForm("text"), '_label -> "Text")
@inputText(candidateForm("schoolName"), '_label -> "School")
</fieldset>
<div class="actions">
<input type="submit" value="Create this computer" class="btn primary"> or
<a href="" class="btn">Cancel</a>
</div>
}
}
@(候选表格:表格[候选人])
@导入助手_
@主(“创建候选对象”){
添加候选人
@表单(routes.Application.save()){
${candidateForm(“firstName”)}
@输入文本(候选表格(“名字”),“_标签->名字”)
@输入文本(候选表格(“姓氏”),“_标签->姓氏”)
@输入文本(候选格式(“文本”),“_标签->文本”)
@输入文本(候选表格(“学校名称”),“_标签->学校”)
或
}
}
控制器:
package controllers;
import static play.data.Form.form;
import models.Candidate;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
import views.html.createForm;
import views.html.index;
public class Application extends Controller {
public static Result index() {
return ok(index.render("Your new application is ready."));
}
/**
* Display the 'new candidate form'.
*/
public static Result create() {
Form<Candidate> candidateForm = form(Candidate.class);
return ok(views.html.createForm.render(candidateForm));
}
/**
* Handle the 'new computer form' submission
*/
public static Result save() {
Form<Candidate> candidateForm = form(Candidate.class).bindFromRequest();
if(candidateForm.hasErrors()) {
return badRequest(createForm.render(candidateForm));
}
candidateForm.get().save();
flash("success", "Computer " + candidateForm.get().firstName + " has been created");
return redirect("/candidates/new");
}
包控制器;
导入静态play.data.Form.Form;
导入模型。候选者;
导入play.data.Form;
导入play.mvc.Controller;
导入play.mvc.Result;
导入views.html.createForm;
导入views.html.index;
公共类应用程序扩展控制器{
公共静态结果索引(){
返回ok(index.render(“新应用程序准备就绪”);
}
/**
*显示“新候选人表格”。
*/
公共静态结果创建(){
表格candidateForm=表格(Candidate.class);
返回ok(views.html.createForm.render(candidateForm));
}
/**
*处理“新电脑表格”提交
*/
公共静态结果保存(){
Form candidateForm=Form(Candidate.class).bindFromRequest();
if(candidateForm.hasErrors()){
返回badRequest(createForm.render(candidateForm));
}
candidateForm.get().save();
flash(“成功”,“计算机”+candidateForm.get().firstName+“已创建”);
返回重定向(“/candidates/new”);
}
有几件事:
为什么学校名单是私人的?我不认为这会改变事情,但值得一看
它可能没有节约,因为它是一个集合,您没有为程序提供任何方向,或者查找现有的学校(并传递id,我认为该字段被称为类似schools.id的名称)然后将其添加到集合或创建一个新学校,然后将其添加到模型表,然后再添加到集合。我主要在play 1.x中工作,而您的似乎是2.x,因此我不熟悉模板语法,但如果您查看play 1.x教程,我记得有一个关于如何处理关系和表单的示例
从火车站写这篇文章,因此无法查找链接,但希望这能让您找到正确的方向。候选表单。get().save();save method在哪里。检查控制器,可能您也有语法错误。检查编译时错误。您的表单有以下内容:
@输入文本(候选表格(“学校名称”),“_标签->学校”)
但是候选类没有shoolName属性。请查看Play附带的计算机数据库示例。它们有一个包含公司名称列表的计算机表单。应该对您有所帮助