我正在编写一个简单的JSF应用程序,需要在数据库中实现CRUD操作。基本上,它是一个空缺管理应用程序,允许候选人申请工作。为简化问题,假设我有以下数据库:
Users
------------
Id
Name
Address
CityId
Cities
-------------
Id
City
我正在使用持久性并实现了两个bean:CityBean和UsersBean。 CityBean看起来如下:
@ManagedBean
@SessionScoped
public class CityBean implements Serializable
{
private static final long serialVersionUID = 1L;
private List<City> cityList = new ArrayList<City>();
public CityBean()
{
cityList.addAll(database.getInstance().getCities());
}
///removed for simplicity
}
我的UsersBean看起来如下:
@ManagedBean
@SessionScoped
public class UsersBean implements Serializable
{
private static final long serialVersionUID = 1L;
public User user = new User();
public String addUser(){
database.getInstance().addUser(user);
return "";
}
}
最后,我的xhtml页面具有以下结构:
<h:form>
<h:outputText value="${texts.name}" />
<h:inputText id="inputName" value="#{usersBean.user.name}" styleClass="tb5" autocomplete="off">
</h:inputText>
<h:inputText id="inputSurname" value="#{usersBean.user.surname}" styleClass="tb5" autocomplete="off">
</h:inputText>
<h:selectOneMenu value="#{cityBean.cityList}">
<f:selectItems value="#{cityBean.cityList}" var="c" itemValue="#{c.id}" itemLabel="#{c.name}"></f:selectItems>
</h:selectOneMenu>
<h:commandButton value="${texts.save}" styleClass="button" action="#{usersBean.addUser}">
</h:commandButton>
</h:form>
xhtml页面正确生成。下拉列表中填充了来自城市表的项目,每个城市的值是城市的ID。但是,插入失败没有错误(数据库中没有插入任何内容)。
另一方面,如果我对元素进行注释(从视图中删除下拉列表),则会在数据库中插入一个用户,其中CityId的值为NULL。
我是JSF的新手程序员,这是我的第一个项目。我在.Net和PHP方面有很多经验,如果你能指出我采用这种方法做错了什么,我将不胜感激。
编辑(用户实体):
@Entity
public class Wine implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private long id;
private String name;
private String surname;
private String address;
private int cityId;
//Constructor left out (an empty and another with parameters)
//Get/Set methods left out
}
答案 0 :(得分:1)
在您的CityBean
字段中创建以存储所选城市/ city.id并输入<h:selectOneMenu value="#{cityBean.cityList}">
而不是列表。列表只能在selectItems
。
答案 1 :(得分:1)
您必须替换此行:
<h:selectOneMenu value="#{cityBean.cityList}">
这一个:
<h:selectOneMenu value="#{usersBean.user.cityId}">
但您没有在应用程序中遵循Java EE最佳实践。例如,您应该在User实体中为User-City关系提供OneToOne批注。您应该遵循JSF / JPA的基础教程,以便更好地理解基础知识。如果你使用Maven,你可以从JSF&amp; JPA原型开始。