我有一个与Company
实体有ManyToMany
关联的Acknowledgement
实体。
@Entity
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "company_acknowledgement", joinColumns = @JoinColumn(name = "company_id"), inverseJoinColumns = @JoinColumn(name = "acknowledgement_id"))
@OrderBy("name")
private Set<Acknowledgement> acknowledgements = new HashSet<>();
...
}
@Entity
public class Acknowledgement {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;
@Column(length = 50, nullable = false)
private String name;
...
}
在表单中,我希望能够选择一些应该绑定到Company
实体的确认(带复选框)。因此,当我将带有POST的表单提交给我的控制器操作时,我的Company
对象包含许多Acknowledgement
个对象。
我尝试将HashSet
更改为TreeSet
as discussed in this question,但没有运气。已检查的Acknowledgement
对象将始终存在于我的数据库中,因此基本上我只需填充每个对象的id
字段。
这是我的控制器代码:
@Controller
public class CompanyController {
@Autowired
private CompanyService companyService;
@RequestMapping("/company/edit/{companyId}")
public String edit(Model model, @PathVariable int companyId) {
Company company = this.companyService.get(companyId);
model.addAttribute("company", company);
return "company-edit";
}
@RequestMapping(value = "/company/edit", method = RequestMethod.POST)
public String doEdit(Model model, Company company) {
return ""; // TODO: persist company
}
}
我的JSP文件(查看)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:url var="actionUrl" value="/company/edit" />
<form:form action="${actionUrl}" commandName="company">
<form:label path="name">Name:</form:label>
<form:input path="name" />
<%-- Other inputs here --%>
<input type="checkbox" name="acknowledgements[]" value="1" />
<input type="checkbox" name="acknowledgements[]" value="2" />
<form:button>Save Changes</form:button>
</form:form>
我尝试了各种各样的东西,上面就是其中之一,但我似乎无法弄清楚如何做到这一点。那么,在提交表单时,如何将选定的确认映射到Company
实体中的关联?
非常感谢你!
答案 0 :(得分:0)
在你的jsp中,你需要迭代循环,如下所示。
<c:forEach items="${company.acknowledgements}" var="ack" varStatus="count">
<input type="checkbox" name="acknowledgements[${count.index}].name" value="${ack.name}" />
</c:forEach>
编辑: 你能试试复选框
吗?<form:checkboxes path="acknowledgements" items="${company.acknowledgements}" />
答案 1 :(得分:0)
为什么不编写自定义请求参数解析器? 例如,实现接口HandlerMethodArgumentResolver (更多:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/method/support/HandlerMethodArgumentResolver.html)。
in&#39; resolverArgument&#39;方法(基于所有参数的请求)您可以使用选定的确认构建公司实体。
答案 2 :(得分:0)
首先,您需要在控制器中加载完整的确认列表并将其放入模型中(假设为acknowledgementList)。只需加载公司只会加载该公司的确认,而不是完整列表。
然后在jsp:
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name" />
答案 3 :(得分:0)
您的equals
和hashCode
实体似乎缺少实施Company
和Acknowledgement
方法。
在你的jsp中,你只需编写如下代码:
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"/>
这些家伙有完整的答案: https://stackoverflow.com/a/8718318/3846688