我有一个添加新公寓的表单,在这个表单中我有一个下拉列表,用户可以在其中选择负责的人员。
显然,当您从下拉列表中选择并尝试保存 Appartment 时,我的应用程序认为 Person 已被修改。它给了我下面的错误,表明我应该先保存这个人。但是 Person 没有被修改。只有 Appartment 应该与对不同 Person 的引用一起保存。
object is an unsaved transient instance - save the transient instance before merging
我怎样才能让我的应用程序了解 Person 本人没有被修改。只有公寓?
这是我的代码:
@Entity
@Table(name = "Person")
public class Person{
@Id
private Long id;
private String fullName;
....
}
@Entity
@Table(name = "Appartment")
public class Appartment{
....
@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn (name = "client_contact_person_id")
private Person clientResponsiblePerson;
}
该操作将所有人员加载到 List ResponsiblePersons 中。
和 JSP:
<s:select name="appartment.clientResponsiblePerson.id" list="responsiblePersons"
listKey="id" listValue="fullName" headerKey="-1"
label="%{getText('appartment.clientContact.ourContact')}" headerValue="%{getText('person.choose')}"
required="true" cssClass="select medium" />
有任何想法吗?我已经搜索和调试了几个小时没有任何解决方案...... :(
更新:史蒂文建议我从appartment.clientResponsiblePerson.id
. 这是一个合理的建议。我只是尝试过,但似乎我的应用程序不知道如何将表单提交的值映射到个人对象。由于我设置listKey="id"
提交的值是人员的 ID。
我收到以下错误:
Invalid field value for field "appartment.clientResponsiblePerson".
tag 'select', field 'list', name 'appartment.clientResponsiblePerson': The requested list key 'responsiblePeople' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
所以我最初的想法是,也许我应该从我的 s:select 中删除 listKey 和 listValue。也许struts会自动检测对象的id并使用toString作为值?但我也试过了,没有更多的运气。
另一个非常奇怪的事情是,我以另一种形式做同样的事情。在那种形式中,我从下拉列表中选择区域。我正在使用 appartment.area.id 作为名称。它在那里完美运行。奇怪..我还检查了 Area - Appartment 引用没有设置为自动保留或合并。
令我震惊的是,我想要实现的目标应该是直截了当的。我没有到达这里是什么?