これが状況であり、私は本当に何をすべきかわかりません。
月が対応する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を取得します。
だから、主な質問は月の名前を表示する方法、それは列挙型の名前ですか?
御時間ありがとうございます。