在 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 main 插入了一些行:
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>
在数据库中一切正常,所有日期都正确(小时数正常)
但是,当我显示 Pilot 列表并在页面上显示它们时,Hibernate 在没有 JSF 的情况下插入的日期有一个少 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 的数据库中没有任何区别,它们看起来都很相似,如果我在 Hibernate 获取它们之后打印日期,一切都很好。
如果我仔细查看 Hibernate 插入并取回的日期,它们包含一个字段 cdate 不是 Gregorian$Date 类型的空值。由 JSF 插入并取回的日期具有 cdate=null。
为什么?为什么 JSF2 对它们的解释不同?