postgres 9.2には、タイムスタンプのある列があります
CREATE TABLE pilot
(
id bigint NOT NULL,
birthdate timestamp without time zone NOT NULL,
firstname character varying(50) NOT NULL,
CONSTRAINT pilot_pkey PRIMARY KEY (id )
)
Hibernate を使用して Java メインで直接いくつかの行を挿入しました。
for (int i = 0; i < 10; i++) {
Pilot p = new Pilot();
p.setBirthdate(new Date());
p.setFirstname("Johnson_" +tabchar[i] );
em.persist(p);
}
私の財産は次のようになります:
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "birthdate", nullable = false, unique = false)
public java.util.Date getBirthdate() {
return birthdate;
}
そして、休止状態にリレーする JSF2 によっていくつかの行が挿入されます: 私は JSF 2.1.13 を使用しています
<h:form id="formPilot">
<h:panelGrid columns="2">
<h:outputLabel value="#{appMsg['pilot.firstname']}" />
<h:inputText id="firstname" label="#{appMsg['pilot.firstname']}" value="#{pilotHolder.pilot.firstname}"
required="true" />
<h:outputLabel value="#{appMsg['pilot.birthdate']}" />
<h:inputText id="birthdate" label="#{appMsg['pilot.birthdate']}" value="#{pilotHolder.pilot.birthdate}"
required="true">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" timeZone="GMT+1"/>
</h:inputText>
</h:panelGrid>
<h:commandButton id="merge" action="#{pilotAction.doMerge}"
value="#{pilotHolder.pilot.id ne null ? appMsg['pilot.update'] : appMsg['pilot.create']}" />
</h:form>
DBではすべて問題ありません。すべての日付は正しいです(時間は問題ありません)
しかし、パイロットのリストを表示してページに表示すると、JSF なしで Hibernate によって挿入された日付のエラーが 1 時間少なくなり、JSF で挿入したタイムスタンプではありませんか?
<h:column>
<f:facet name="header">
<h:outputText value="#{appMsg['pilot.birthdate']}" />
</f:facet>
<h:outputText value="#{p.birthdate}" >
<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" timeZone="GMT+1"/>
</h:outputText>
</h:column>
奇妙なのは、DBvisualizer を使用して DB に違いがないことです。それらはすべて似ています。Hibernate がフェッチした後に日付を出力すると、すべて問題ありません。
Hibernate によって挿入され、フェッチされた日付をよく見ると、Gregorian$Date 型のフィールド cdate not null が含まれています。JSF によって挿入され、取り戻された日付には、cdate=null があります。
なんで?JSF2 によって解釈が異なるのはなぜですか?