用Spring形式绑定多个关联
我有一个用Spring形式绑定多个关联,spring,spring-mvc,data-binding,spring-form,Spring,Spring Mvc,Data Binding,Spring Form,我有一个公司实体,该实体与确认实体有多个关联 @Entity public class Company { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column private int id; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "company_acknowledgement", joinColumn
公司
实体,该实体与确认
实体有多个
关联
@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;
...
}
和我的JSP文件(视图)
姓名:
保存更改
我尝试了各种方法,上面就是其中之一,但我似乎不知道如何做到这一点。那么,在提交表单时,我如何将所选确认映射到我的公司
实体中的关联
提前非常感谢 在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}" />
为什么不编写自定义请求参数解析器? 例如,实现接口HandlerMethodArgumentResolver (更多:)
在“ResolveRagument”方法中(基于带所有参数的请求),您可以使用选定的确认来构建公司实体。首先,您需要在控制器中加载确认的完整列表,并将其放入模型中(比如确认列表)。简单地载入公司只会载入campany的确认,而不是完整的列表 然后在jsp中:
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name" />
您似乎缺少
公司和实体上的equals
和hashCode
方法的实现
在jsp中,您只需编写如下代码:
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"/>
这些人有完整的答案:
这看起来不错,直到我提交POST请求,其中绑定对象时出现以下异常:org.springframework.beans.InvalidPropertyException:bean类[com.example.company.entity.company]的无效属性“Acknowledges[0]:无法从大小为0的集合中获取索引为0的元素,使用属性路径“确认[0]”访问。
您必须将设置更改为列表以确认,因为设置没有索引。此外,该集合的大小似乎为0。请确保确认已从companyService.get(companyId)加载;方法,正如我看到的,它懒散地加载在实体类中。很抱歉,没有尽快回复您。我将字段更改为java.util.List
(运行时org.hibernate.collection.internal.PersistentBag
),但结果相同。集合确实是从调用我的服务的数据库中获取的。点击doEdit
controller操作时会发生错误,此时在绑定到对象时集合尚未初始化。我没有理解您。您的意思是说这是延迟加载问题吗?我的意思是,在呈现编辑页面(编辑控制器操作)时不会出现该问题。在那里,确认被很好地加载,因为它们已经通过调用我的服务中的get
方法加载了。当过帐到doEdit
控制器操作时会出现问题-更具体地说,当过帐数据绑定到company
参数时。我不完全确定,但我的猜测是,在对象绑定期间,我用复选框选择的索引将尝试在集合上查找,但此时集合为空。我希望这有帮助。
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name" />
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"/>