如何将对象添加到另一个对象的列表中并将其保留在JSF中?

时间:2017-05-05 13:45:21

标签: hibernate jpa

我是JSF和Java EE的新手,我一直在努力坚持一个名为Room的实体,它有一个或多个床,其中包含以下代码:

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

}

我有一个bedRegistrationService,用于持久化并从dabatase获取对象,以及用于持久化房间的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:08,205 INFO [javax.enterprise.resource.webcontainer.jsf.renderkit](默认任务-35)警告:FacesMessage已入队,但可能没有显示。 sourceId = roomRegForm:j_idt41 [severity =(ERROR 2),summary =(roomRegForm:j_idt41:验证错误:值无效),detail =(roomRegForm:j_idt41:验证错误:值无效)]

认为我可能不得不使用bed.number作为xhtml而不是床的值(因为转换器解析html字符串并将其转换为床,我试图改为bed.number只是为了看看会发生什么,发生以下情况: enter image description here

不知道为什么&#34; on&#34;显示而不是错误的值。我几乎一无所知,我认为这可能与转换器或我缺乏表达语言知识有关。我唯一的目标是坚持一个或多个床的房间。我为可怕的英语和新手问题道歉,但我已经坚持这个问题好几天了。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

selectManyCheckbox可能希望所选项目存在于其已知的selectItems中,因此它会进行相等性检查。此检查失败,因为您的转换器创建了一个新的Bed实例,而您的Bed类没有定义hashCode / equals。因此bed.equals(sameConvertedBed)总是会因实例相等而失败。

您应该在实体类中定义hashCode和equals,例如基于Bed&amp;&amp; amp; id等于。在实施时请记住代理。即做other.getId(),而不是other.id