2017-05-05 89 views
0

我是新來的JSF和Java EE和我一直在掙扎堅持實體命名的客房擁有一個或多個牀,它由以下代碼:如何將對象添加到另一個對象的列表中並將其保存到JSF中?

package ninfa.javahostel.domain; 


import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 
@Entity 
public class Bed { 
@Id @GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@ManyToOne 
private Room room; 

private Integer number; 
private Double pricePerNight; 
public Long getId() { 
    return id; 
} 
public void setId(Long id) { 
    this.id = id; 
} 
public Room getRoom() { 
    return room; 
} 
public void setRoom(Room room) { 
    this.room = room; 
} 
public Integer getNumber() { 
    return number; 
} 
public void setNumber(Integer number) { 
    this.number = number; 
} 
public Double getPricePerNight() { 
    return pricePerNight; 
} 
public void setPricePerNight(Double pricePerNight) { 
    this.pricePerNight = pricePerNight; 
} 

} 

實體間組成的下面的代碼:

package ninfa.javahostel.domain; 
import java.util.Set; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 

@Entity 
public class Room { 
    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String number; 
    @OneToMany (cascade = CascadeType.ALL, mappedBy = "room") 
    private Set<Bed> beds; 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getNumber() { 
      return number; 
    } 

    public void setNumber(String number) { 
     this.number = number; 
    } 
    public Set<Bed> getBeds() { 
     return beds; 
    } 
    public void setBeds(Set<Bed> beds) { 
     this.beds = beds; 
    } 

} 

我有用於保留,並從dabatase對象bedRegistrationService和用於保留客房一個roomRegistrationService。 除此之外,我只有一個負責所有事情的控制器,我知道架構非常糟糕,但我只是試圖實現一個簡單的CRUD並習慣JSF。代碼如下(我試了碼跨度反引號,但他們似乎沒有工作):

牀轉換器:https://pastebin.com/b1ZwYS75

roomRegistrationService:https://pastebin.com/sBaDzrfh

bedRegistrationService:https://pastebin.com/jjsMbVPA

這個RegistrationController:https://pastebin.com/cfZeB16d

roomcreate.xhtml:https://pastebin.com/UMCcW7U7

表與數據庫中的

所有的牀正確呈現每當我試圖提交我得到控制檯以下錯誤:10:07:08205 INFO [javax.enterprise.resource.webcontainer。 jsf.renderkit](默認任務-35)警告:FacesMessage已被入隊,但可能未被顯示。 的SourceID = roomRegForm:j_idt41 [嚴重性=(ERROR 2),彙總=(roomRegForm:j_idt41:驗證錯誤:值是無效的),細節=(roomRegForm:j_idt41:驗證錯誤:值是無效的)]

考慮到我可能不得不使用bed.number作爲xhtml而不是bed的值(因爲轉換器解析html字符串並將其轉換爲Bed,我試圖改爲bed.number,以查看會發生什麼以及發生以下情況: enter image description here

不知道爲什麼會顯示「on」而不是錯誤的值,我覺得這很無助,我認爲這可能與轉換器或我缺乏表達式語言知識有關。目標是堅持一個或多個牀位的房間ogize爲糟糕的英語和新手問題,但我一直堅持這個問題好幾天。先謝謝您的幫助。

+0

我想我看到了這個問題,但是在將來你應該真的創建一個最小的再現器,而不是傾銷你所有的代碼。你將更有可能得到答案,或者在過程中自己弄清楚。 –

+0

並做正確的標記...問題在99.5%的時間NOT jpa和jsf在同一時間相關。 – Kukeltje

+0

我會說這是JSF相關... –

回答

1

selectManyCheckbox可能期望所選項存在於其已知的selectItems中,因此它會進行相等性檢查。此檢查失敗是因爲您的轉換器創建了一個新的Bed實例,而您的Bed類沒有定義hashCode/equals。所以bed.equals(sameConvertedBed)將總是失敗的基礎上實例的平等。

您應該在實體類中定義hashCode和equals,例如,基於instanceof Bed等於&。在實施時記住代理。即做other.getId(),而不是other.id

相關問題