我正在使用 play2.2.1 并尝试在之间创建 ManyToMany 关系Jobads and 职位类别 models.
My 工作任务.java
package models;
@Entity
public class Jobads extends Model {
@Id
public Long id;
@ManyToOne
public Employers employer;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "jobads_jobcategories")
public List<Jobcategories> jobcategory;
@ManyToOne
public Joblocations joblocations;
@Required
public String jobtype;
@Required
public String title;
@Required
public String text;
@Required
public Long salary;
@Required
public String experience;
@Required
public String active;
@Formats.DateTime(pattern="yyyy-MM-dd hh:mm:yy")
public Date created_time = new Date();
@Formats.DateTime(pattern="yyyy-MM-dd hh:mm:yy")
public Date modified_time ;
@Required
@Formats.DateTime(pattern="yyyy-MM-dd")
public Date expire_date ;
public static Finder<Long,Jobads> find = new Finder<Long,Jobads>(
Long.class, Jobads.class
);
public static Jobads create(Jobads ja) {
ja.save();
ja.saveManyToManyAssociations("jobcategory");
return ja;
}
}
My view:
<form action="@routes.JobAdController.save()" method="post" onsubmit="return checkEmpty();">
<div class="row">
<div class="col-md-6">
<div class="block">
<div class="header">
<h2>Create A New Job</h2>
</div>
<div class="content controls">
<div class="form-row">
<div class="col-md-3">Employer</div>
<div class="col-md-9">
<select class="form-control" name="employer.id" id="employer_id">
<option value="select">Select Employer</option>
@for(emp<-employersList) {
<option value="@emp.id">@emp.company_name</option>
}
</select>
</div>
</div>
<div class="form-row">
<div class="col-md-3">Category</div>
<div class="col-md-9">
<select class="form-control" name="jobcategory.id" id="jobcategory_id">
<option value="select">Select Job Category</option>
@for(jc<-jobcategoryList) {
<option value="@jc.id">@jc.name</option>
}
</select>
</div>
</div>
<div class="form-row">
<div class="col-md-3">Location</div>
<div class="col-md-9">
<select class="form-control" name="joblocations.id" id="joblocation_id">
<option value="select">Select Job Location</option>
@for(jl<-joblocationList) {
<option value="@jl.id">@jl.country,@jl.state,@jl.city</option>
}
</select>
</div>
</div>
<div class="form-row">
<div class="col-md-3">Job Type</div>
<div class="col-md-9">
<select class="form-control" name="jobtype" id="jobtype">
<option value="select">Select Job Type</option>
<option value="parttime">Part Time</option>
<option value="fulltime">Full Time</option>
</select>
</div>
</div>
<div class="form-row">
<div class="col-md-3">Title</div>
<div class="col-md-9"><input type="text" class="form-control" placeholder="Title" name="title" required="required"/></div>
</div>
<div class="form-row">
<div class="col-md-3">Text</div>
<div class="col-md-9"><textarea class="form-control" name="text" required="required"></textarea></div>
</div>
<div class="form-row">
<div class="col-md-3">salary</div>
<div class="col-md-9"><input type="text" class="form-control" placeholder="Salary per month" name="salary" required="required"/></div>
</div>
<div class="form-row">
<div class="col-md-3">expire date</div>
<div class="col-md-9"><input type="date" class="form-control" placeholder="expiry date" name="expire_date" id="expire_date" required="required" /></div>
<input type="hidden" class="form-control" placeholder="expiry date" name="exp_date" id="exp_date" />
</div>
<div class="form-row">
<div class="col-md-3">Active</div>
<div class="col-md-9">
<select class="form-control" name="active" id="active">
<option value="active">Active</option>
<option value="inactive">Inactive</option>
</select>
</div>
</div>
<div class="form-row">
<div class="col-md-12">
<button type="submit" class="btn btn-default btn-block">Add</button>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
还有我的控制器:
public class JobAdController extends Controller {
public static Result save() {
Form<Jobads> jobadsFormData = jobadsForm.bindFromRequest();
if (jobadsFormData.hasErrors()) {
System.out.println("Error in form");
return badRequest();
} else {
Jobads.create(jobadsFormData.get());
return redirect(controllers.routes.JobAdController.index());
}
}
}
我在 Jobcategory 模型中没有 Jobad 变量,因为我在那里不需要它。因此创建了一个默认表,名为工作广告_工作类别。我的问题是,当我尝试在 jobads 表中插入数据时,它已完美插入,但映射 ID 未保存在工作广告_工作类别 table.
我的工作类别列表是空的,感谢rtruszk帮助我。
Play 无法将请求中的多值变量绑定到模型多列表变量(我仍在尝试弄清楚为什么 play 会这样做)
为了解决这个问题,我更改了表单方法,从控制器中的 url 获取多值变量的值,然后创建一个新列表并将其添加到我的表单变量中。它是可选的,但我添加了 getter 和 setter 并更改了我的列表名称。下面给出的代码
For GET request
public static Result save() {
List<Long> jobCatList = new ArrayList<Long>();
final Set<Map.Entry<String, String[]>> entries = request().queryString().entrySet();
for (Map.Entry<String, String[]> entry : entries) {
final String key = entry.getKey();
final String value = Arrays.toString(entry.getValue());
System.out.println(key + " " + value);
if (key.equalsIgnoreCase("jobcategories.id")) {
String val = value;
val = val.replace("[", "");
val = val.replace("]", "");
String[] a = val.split(",");
for (int i = 0; i < a.length; i++) {
jobCatList.add(Long.parseLong(a[i].trim()));
}
}
}
List<Jobcategories> jobCatObList = new ArrayList<Jobcategories>();
for (Long id : jobCatList) {
System.out.println("Id are:" + id);
jobCatObList.add(Jobcategories.findById(id));
}
System.out.println(request().getQueryString("jobcategories.id"));
Form<Jobads> jobadsFormData = jobadsForm.bindFromRequest();
System.out.println("\nCategory Form are:" + (jobadsFormData.get()).getJobcategories());
(jobadsFormData.get()).setJobcategories(jobCatObList);
if (jobadsFormData.hasErrors()) {
return badRequest();
} else {
Jobads.create(jobadsFormData.get());
return redirect(controllers.routes.JobAdController.index());
}
}
OR
For POST要求
public static Result save() {
Form<Jobads> jobadsFormData = jobadForm.bindFromRequest();
Map<String, String[]> formUrlEncoded = request().body().asFormUrlEncoded();
List<Jobcategories> fa = new ArrayList<Jobcategories>();
for (String key : formUrlEncoded.keySet()) {
String[] values = formUrlEncoded.get(key);
for (String val : values) {
if ("jobcategories.id".equals(key)) fa.add(Jobcategories.findById(Long.valueOf(val)));
}
}
if (jobadsFormData.hasErrors()) {
return badRequest();
} else {
(jobadsFormData.get()).setJobcategories(fa);
Jobads.create(jobadsFormData.get());
return redirect();
}
}
我知道这种方法不是保存多对多关系的正确方法,但我没有任何其他选择来解决我的问题。
如果有人有更好的解决方案,请发布它,因为我已经尝试了好几天并且已经取得了这么多成就。
为什么玩不能够映射或保存多对多关系?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)