0

「新しい価格」を選択するとp:selectOneMenu、「値が無効です」という検証エラーが表示されます。これは、新しい価格の ID をbugBean.generateNewPrice()手動で設定すると停止します。
レコードをデータベースにマージ/永続化する前に id-value を設定して、その間にレコードが占有されていないことを確認するべきではないため、より意味のある自動生成された id-value でさえ良い考えではありません。

バグ.xhtml

   <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">
     <h:head>
    </h:head>

<h:body>
    <h:form id="selectTest">

        <p:selectOneMenu id="selectPrice" value="#{bugBean.selectedPrice}" converter="omnifaces.SelectItemsConverter">
        <f:selectItem itemValue="" itemLabel="choose price"/>
        <f:selectItem itemValue="#{bugBean.generateNewPrice()}" itemLabel="new price"/>
        <f:selectItems value="#{bugBean.getPrices()}" var="price" itemLabel="#{price.value}"/>      
        <p:ajax update="@all"/>
        </p:selectOneMenu>
        <p:messages autoUpdate="true"/>

</h:form>
</h:body>
</html>

BugBean.java

package hoho.main.managebean;

import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import hoho.model.generated.Price;
import hoho.service.BugService;

@Named
@SessionScoped
public class BugBean implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Inject
    BugService bugService;

    private Price selectedPrice;

    public List<Price> getPrices(){
        List<Price> prices = bugService.getPrices();
        return prices;
    }

    public Price generateNewPrice(){
        Price price = new Price();
        // price.setId(424234234L);
        return price;
    }

    public Price getSelectedPrice() {
        return selectedPrice;
    }

    public void setSelectedPrice(Price selectedPrice) {
        this.selectedPrice = selectedPrice;
    }   

}

価格エンティティ:

package hoho.model.generated;

import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.List;


/**
 * The persistent class for the price database table.
 * 
 */
@Entity
public class Price implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private BigDecimal value;

    //bi-directional many-to-one association to DeliveryMethodHasPrice
    @OneToMany(mappedBy="price", fetch=FetchType.EAGER)
    private List<DeliveryMethodHasPrice> deliveryMethodHasPrices;

    //bi-directional many-to-one association to Item
    @OneToMany(mappedBy="price", fetch=FetchType.EAGER)
    private List<Item> items;

    //bi-directional many-to-one association to TaxRate
    @ManyToOne
    @JoinColumn(name="tax_rate_id1")
    private TaxRate taxRate;

    public Price() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public BigDecimal getValue() {
        return this.value;
    }

    public void setValue(BigDecimal value) {
        this.value = value;
    }

    public List<DeliveryMethodHasPrice> getDeliveryMethodHasPrices() {
        return this.deliveryMethodHasPrices;
    }

    public void setDeliveryMethodHasPrices(List<DeliveryMethodHasPrice> deliveryMethodHasPrices) {
        this.deliveryMethodHasPrices = deliveryMethodHasPrices;
    }

    public List<Item> getItems() {
        return this.items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

    public TaxRate getTaxRate() {
        return this.taxRate;
    }

    public void setTaxRate(TaxRate taxRate) {
        this.taxRate = taxRate;
    }

    @Override
    public boolean equals(Object other) {
        System.out.println("hey");
        return (other instanceof Price) && (id != null)
            ? id.equals(((Price) other).id)
            : (other == this);
    }

    @Override
    public int hashCode() {
        return (id != null)
            ? (this.getClass().hashCode() + id.hashCode())
            : super.hashCode();
    }

    @Override
    public String toString() {
        return "Price[id=" + id + "]";
    }

}
4

1 に答える 1

1

あなたが望むものを達成する方法はありません。デザインを少し変える必要があると思います。

  1. New priceのオプションとして入れるのではなくh:selectOneMenu、スタンドアロンにしてh:booleanCheckboxください。ユーザーがボックスにチェックを入れると、ID なしで新しいエンティティを作成できます。
  2. もう 1 つの方法は、New priceの代わりにデフォルトのオプションを作成することですChoose one...。ユーザーが価格を選択しなかった場合は、新しいPriceエンティティを作成します。
于 2013-04-23T12:22:13.487 に答える