0

これが状況であり、私は本当に何をすべきかわかりません。
月が対応するint値として保持されるjpaとenumで月を保持したい。私は同様の質問をたくさん読み、序数と文字列と@列挙に関する意見を知っていますが、このカスタムint値を使用したいので、これを行うことにしました:

public enum Months {        
    January(1),
    February(2),
    March(3),
    April(4),
    May(5),
    Jun(6),
    July(7),
    August(8),
    September(9),
    October(10),
    November(11),
    December(12);

    private int intValue;

    private Months(int v) {
        this.intValue = v;
    }

    public int getIntValue() {
        return intValue;
    }

    // Mapping month to int
    private static final Map<Integer, Months> mapMonth = new HashMap<Integer, Months>();
    static
    {
        for (Months m : Months.values())
            mapMonth.put(m.intValue, m);
    }

    //Get month from int
    public static Months getMonthName(int v)
    {
        Months m = mapMonth.get(Integer.valueOf(v));
        return m;
    }

}

@Transient
private transient Months month; //actual enum; not stored in db
@Column(name="month")  
private int monthInt; // enum int value gets stored in db

したがって、実際には int 属性 intMonth を永続化し、xhtml で次のようなラベルのような列挙名を使用します。

<h:outputText value="* #{bundle.month}: " />  
                <h:selectOneMenu 
                    value="#{adminMembershipBean.membership.monthInt}"
                    panelStyle="width:150px"  
                    effect="fade" 
                    var="m" 
                    style="width:160px"
                    filter="true" 
                    filterMatchMode="startsWith">  
                    <f:selectItem itemLabel="Select One" itemValue="" />  
                    <f:selectItems 
                        value="#{adminMembershipBean.months}" 
                        var="months" 
                        itemLabel="#{months}" 
                        itemValue="#{months.intValue}"/> 
                    <p:column>  
                        #{m} 
                    </p:column>  
                </h:selectOneMenu>

ところで、おまけの質問があります:
p:selectOneMenu が列挙名を表示しないのはなぜですか? これが問題であることはわかっており、解決策の 1 つは h:selectOneMenu を使用することですが、primefaces スタイルのコンボボックスがありません。

それで、今、私は私のデータベースに例4とxhtml Aprilを入れましたが、それで問題ありません。
しかし、データベースから他のxhtmlでその4を読みたい場合、4月を取得できず、空のセルが取得されます(これはp:datatableからの抜粋です):

<p:column sortBy="#{membership.monthInt}">
<f:facet name="header">
<h:outputText value="#{bundle.month}" />
</f:facet>
<h:outputText value="#{membership.month.getMonthName(membership.monthInt)}"/>
</p:column>

私がちょうど置くなら

membership.monthInt

私は4を取得します。
だから、主な質問は月の名前を表示する方法、それは列挙型の名前ですか?
御時間ありがとうございます。

4

1 に答える 1