2012-06-21 44 views
1

我有一個表單來添加新的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的參考資料沒有設置爲自動持續或合併。

它讓我覺得我正在努力實現的應該是真正的直截了當。這是什麼,我不在這裏?

+0

您作爲更新發布的消息意味着傳遞給列表屬性(responsiblePersons)的值不是「集合/數組/映射/枚舉/迭代器」。除非更改了動作的getResponsiblePersons()方法,或者更改了s:select標籤上的列表屬性的值,否則不應該出現該錯誤。 –

回答

1

當我們從下拉列表中選擇並嘗試保存公寓時,我的申請會認爲人員已被修改。

這正是你的代碼所做的。以下行是罪魁禍首:

appartment.clientResponsiblePerson.id 

這是告訴Struts2框架把你在選擇降下來的人的ID,並把它傳遞給getAppartment().getClientResponsiblePerson().setId(id)。這不會改變爲新的負責人,它會改變現有人的主鍵。調用setClientResponsiblePerson(Person)會改變這個人。

嘗試使用appartment.clientResponsiblePerson,而不是看看它是如何工作的。

更新

另一種非常奇怪的事情是,我做同樣的事情的另一種形式。

我不明白這是怎麼回事。

Struts2的不知道Person是什麼,所以你有幾種選擇:

  1. 創建的類型轉換告訴Struts2的如何從「1」轉換(或無論是從下拉列表中傳遞)到Person的一個實例。
  2. 增加您的行動setPerson(Integer)方法,該方法將查找基於傳入的整數主鍵適當的Person實體,然後更新您的S:選擇<s:select name="person" list="responsiblePersons" .../>

就個人而言,我用#1。

+0

感謝您的回答。剛剛嘗試過,它給了我另一個新的錯誤。請參閱我更新的答案以獲取更多詳細信息 – user829237

+0

請提供您的s:select的更新代碼。你仍然需要listKey和listValue,它們驅動下拉菜單中的內容,與Struts2在後端做什麼無關。 –

+0

感謝您的更新史蒂文。只要我得到時間併發布結果,我會盡快完成。但我認爲你只是給了我我想念的解決方案:)不知道爲什麼其他形式的作品雖然..但這是一個不同的故事。 – user829237

相關問題