JSF实体转换器难度大

时间:2013-06-08 19:36:35

标签: jsf-2 jpa-2.0 converter facelets ejb-3.1

我正在开发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() {
}

}

我的商家实体上有哈希码和等号,我现在只有一个持久化实体。 我需要转换器吗?我该怎么解决这个问题? 谢谢,

1 个答案:

答案 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);
}