0

我正在开发 JSF2.1(PF3.5) + EJB(3.1) + JPA(eclipselink2.4.1)。在 facelet 上,我有一个带有输入框的表单,用于使用 ajax 搜索“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="Nome Comerciante: " />
<p:inputText id="merchantFirstName"
    value="#{merchantMB.searchedMerchant.firstName}" readonly="true">
</p:inputText>

<h:outputText value="Email Comerciante: " />
<p:inputText id="merchantEmail"
    value="#{merchantMB.searchedMerchant.email}" readonly="true">
</p:inputText>

在第二种形式中,我需要关联 searchedMerchant 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) 提交 searchedMerchantId 以与它的 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() {
    }
}

我的 Merchant 实体上有 hashcode 和 equals,而我现在只有一个持久化实体。我需要转换器吗?我该如何解决这个问题?

4

1 回答 1

0

解决了!

我在餐厅管理的 bean 中实现了搜索方法(我在商家管理的 bean 中也有它,我正在尝试使用它);信息存储在商家的一个实例中,当我操作餐厅的实例时,在持续更改之前,我设置了这家餐厅的商家(外键)。下面是我的餐厅管理 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);
}
于 2013-06-10T18:34:40.663 回答