我正在开发JSF2.1(PF3.5)+ EJB(3.1)+ JPA(eclipselink2.4.1)。 在facelet上,我有一个带有输入框的表单,用于搜索带有ajax的“Merchant”实体。 我需要搜索到的商家参考与我的“餐厅”实体相关联,因为“商家”是餐厅的外键。 我可以在一个表单上获取搜索的Merchant值,并在另一个表单输入字段中呈现这些值。我不知道如何在第二个表单上的另一个餐厅字段中传输此商家参考。至于我可以访问这个商家的字段,我想我需要一个实体转换器,但我所做的不起作用。 下面,相关代码:
这是第一个表单上的搜索框:
<p:inputText value="#{merchantMB.searchValue}" required="true"
requiredMessage="Pf associe um comerciante ao Restaurante!">
<f:ajax event="blur" listener="#{merchantMB.search}"
render="results :restaurantDetailForm:merchantFirstName:restaurantDetailForm:merchantEmail" />
</p:inputText>
第二种形式,我可以从搜索到的实体访问值:
<h:outputText value="Email Comerciante: " />
<p:inputText id="merchantEmail"
value="#{merchantMB.searchedMerchant.email}" readonly="true">
</p:inputText>
在第二种形式中,我需要关联searchingMerchant id,因为此值是我的Restaurant实体的外键。 同样在这种形式下,我可以访问与“相关”相关的字段,如下所示:
<h:outputText value="Nome Restaurante: " />
<p:inputText id="name"
value="#{restaurantMB.selectedRestaurant.name}" required="true"
requiredMessage="Pf introduza o nome!">
<p:watermark for="name" value="Nome" />
</p:inputText>
我如何通过Managed Bean(restaurantMB)提交searchMerchantId,与它的restaurantMB.selectedRestaurant.merchant.id联系?
这是我的餐厅MB(相关部分):
// Selected restaurant that will be updated
private Restaurant selectedRestaurant;
@PostConstruct
public void init() { //
newRestaurant = new Restaurant();
newRestaurant.setDateOfInscriptionAsRestaurant(getCurrentTimeStamp());
lazyModel = new LazyRestaurantDataModel(das);
selectedRestaurant = new Restaurant();
selectedRestaurant.setMerchant(new Merchant());
}
和我的餐厅实体(相关部分):
@Entity
@Table(name = "RESTAURANTS")
public class Restaurant extends BaseEntity implements Serializable {
/...other stuff.../
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "merchantID")
private Merchant merchant; <---------THIS IS THE FK
/**
* @return the merchant
*/
public Merchant getMerchant() {
return merchant;
}
/**
* @param merchant the merchant to set
*/
public void setMerchant(Merchant merchant) {
this.merchant = merchant;
}
public Restaurant() {
}
}
我的商家实体上有哈希码和等号,我现在只有一个持久化实体。 我需要转换器吗?我该怎么解决这个问题? 谢谢,
答案 0 :(得分:0)
解决了!
我在餐厅托管bean中实现了搜索方法(我也在商家托管bean中使用它,我试图使用它); info存储在Merchant的一个实例中,当我操作Restaurant的实例时,在持续更改之前我设置了这个Restaurant的商家(外键)。 在我餐厅托管bean的相关代码下面。
//the merchant to store values searched, used in update
private Merchant searchedMerchant;
private String searchValue;
//the correspondent restaurant-merchant, used in update, and new record
private Merchant merchant;
/**
* @return the merchant
*/
public Merchant getMerchant() {
return merchant;
}
/**
* @param merchant the merchant to set
*/
public void setMerchant(Merchant merchant) {
this.merchant = merchant;
}
/**
* @return the searchValue
*/
public String getSearchValue() {
return searchValue;
}
/**
* @param searchValue the searchValue to set
*/
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
/**
* @return the searchedMerchant
*/
public Merchant getSearchedMerchant() {
return searchedMerchant;
}
/**
* @param searchedMerchant the searchedMerchant to set
*/
public void setSearchedMerchant(Merchant searchedMerchant) {
this.searchedMerchant = searchedMerchant;
}
/**
*
* @param actionEvent
*/
public void doUpdateRestaurant(ActionEvent actionEvent) {
// logger.log(Level.INFO, "doUpdateUser(ActionEvent actionEvent)");
System.out.println("doUpdateRestaurant(ActionEvent actionEvent): "
+ selectedRestaurant.toString());
selectedRestaurant.setMerchant(searchedMerchant);<---I was missing this!
das.update(selectedRestaurant);
}