我有一个表单来添加新的Appartments,并且在这个表单中我有一个下拉框,用户可以选择哪个人负责。对象是一个未保存的瞬态实例 - 在合并之前保存瞬态实例
当我们从下拉列表中选择并尝试保存该公寓时,我的申请会认为该人已被修改。它给了我下面的错误表明我应该先保存这个人。但该人没有修改。只有公寓才能被保存并提及另一个人。
object is an unsaved transient instance - save the transient instance before merging
我怎样才能让我的应用程序了解该人本人没有被修改。只有公寓?
这里是我的代码:
@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;
}
动作加载所有的人加入列表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" />
任何想法?我一直在寻找和调试了几个小时,没有任何解决方案... :(
UPDATE:。 史蒂芬建议我从appartment.clientResponsiblePerson.id
删除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的参考资料没有设置为自动持续或合并。
它让我觉得我正在努力实现的应该是真正的直截了当。这是什么,我不在这里?
您作为更新发布的消息意味着传递给列表属性(responsiblePersons)的值不是“集合/数组/映射/枚举/迭代器”。除非更改了动作的getResponsiblePersons()方法,或者更改了s:select标签上的列表属性的值,否则不应该出现该错误。 –