gpt4 book ai didi

java - 对象是未保存的 transient 实例 - 在合并之前保存 transient 实例

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:34 28 4
gpt4 key购买 nike

我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。

显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保存该人。但 Person 没有被修改。只有公寓才应该通过引用不同的人来保存。

对象是未保存的 transient 实例 - 在合并之前保存 transient 实例

我怎样才能让我的应用程序明白这个人本身没有被修改。只有公寓吗?

这是我的代码:

@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;
}

该操作将所有人员加载到责任人列表中。

和 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" />

有什么想法吗?我已经搜索和调试了几个小时,没有任何解决方案...:(

更新:Steven 建议我从 appartment.clientResponsiblePerson.id 中删除该 ID。这是一个合理的建议。我只是尝试了一下,但我的应用程序似乎不知道如何将表单提交的值映射到 Person 对象。当我设置 listKey="id" 时,提交的值是人员的 ID。

我收到以下错误:字段“appartment.clientResponsiblePerson”的字段值无效。

标签“select”,字段“list”,名称“appartment.clientResponsiblePerson”:请求的列表键“responsiblePeople”无法解析为集合/数组/映射/枚举/迭代器类型。示例:人或人。{name} - [未知位置]

所以我最初的想法是也许我应该从 s:select 中删除 listKey 和 listValue。也许struts会自动检测对象的id并使用toString作为值?但我也尝试过,但没有任何运气。

另一件非常奇怪的事情是我以另一种形式做了完全相同的事情。在该表单中,我从下拉列表中选择区域。我使用 appartment.area.id 作为名称。它在那里完美地工作。奇怪..我还检查了区域 - 公寓引用未设置为自动保留或合并。

令我印象深刻的是,我想要实现的目标应该是非常直接的。我没有到达这里是什么?

最佳答案

Apparantly my application thinks that the Person is modified when you select from the dropdown and try to save the Appartment.

这正是您的代码正在做的事情。下面这行是罪魁祸首:

appartment.clientResponsiblePerson.id

这就是告诉 Struts2 框架获取您在下拉列表中选择的人员的 ID,并将其传递给 getAppartment().getClientResponsiblePerson().setId(id) 。这不会改变新的负责人,而是改变现有负责人的主键。调用 setClientResponsiblePerson(Person) 会更改此人。

尝试使用appartment.clientResponsiblePerson相反,看看它对您有何作用。

更新

Another really strange thing is that I do the exact same thing in another form.

我也不明白那是如何工作的。

Struts2 不知道 Person 是什么?是的,所以你有几个选择:

  1. 创建一个类型转换器来告诉 Struts2 如何从“1”(或从下拉列表中传入的任何内容)转换为 Person 的实例。
  2. 添加setPerson(Integer)您的操作上的方法将根据传入的 Integer 主键查找适当的 Person 实体,然后将您的 s:select 更新为 <s:select name="person" list="responsiblePersons" .../>

就我个人而言,我使用#1。

关于java - 对象是未保存的 transient 实例 - 在合并之前保存 transient 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143491/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com