0

我有一个与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 Acknowledgementid

这是我的控制器代码:

@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在提交表单时将选定的确认映射到我的实体中的关联?

非常感谢您!

4

4 回答 4

0

首先,您需要在控制器中加载完整的确认列表并将其放入您的模型中(比如说确认列表)。简单地加载公司只会加载该公司的确认,而不是完整的列表。

然后在jsp中:

<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"  />
于 2015-02-05T15:56:32.330 回答
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}" />
于 2015-01-27T16:57:16.213 回答
0

为什么不编写自定义请求参数解析器?例如实现接口 HandlerMethodArgumentResolver(更多:http ://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/method/support/HandlerMethodArgumentResolver.html )。

在“resolverArgument”方法中(基于带有所有参数的请求),您可以使用选定的确认来构建公司实体。

于 2015-01-29T19:21:25.150 回答
0

似乎您缺少您和实体的实现equalshashCode方法。CompanyAcknowledgement

在您的 jsp 中,您只需编写如下代码:

<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"/>

这些家伙有完整的答案: https ://stackoverflow.com/a/8718318/3846688

于 2016-04-28T07:55:33.813 回答