我想在數據庫中僅更新表單中指定的那些字段。在實體「帳戶」中,我使用註釋@DynamicUpdate
。在@RequestScoped bean上回發時保留GET參數
類AccountMB
(@RequestScoped
)與方法:
public String update() {
getDao().update(getInstance());
return SUCCESS;
}
public Account getInstance() {
//setId(new Long("1"));
if (instance == null) {
if (id != null) {
instance = loadInstance();
} else {
instance = createInstance();
}
}
return instance;
}
,並形成form.xhtml:
<f:metadata>
<f:viewParam name="accountId" value="#{accountMB.id}" />
</f:metadata>
<h:form prependId="false">
<h:inputHidden id="accountId" value="#{accountMB.id}"/>
<h:inputHidden id="id" value="#{accountMB.instance.id}"/>
<h:inputText id="firstName" value="#{accountMB.instance.firstName}"/>
<h:commandButton type="submit" action="#{accountMB.update}" value="Save">
<f:setPropertyActionListener target="#{accountMB.id}" value="1" />
</h:commandButton>
</h:form>
我打開form.xhtml?accountId=1
頁面,在加載數據的形式,點擊 「保存」。它寫一個錯誤:
java.sql.SQLException: ORA-01407: cannot update ("MYBD"."ACCOUNTS"."EMAIL") to NULL
如果getInstance()
方法取消註釋setId(new Long("1"));
,該數據被保存。
如果我在AccountMB
中使用註釋@ViewScoped
,數據將被保存。我想使用註釋@RequestScoped
。
據我所知,我觸發了createInstance();
並且電子郵件字段沒有填寫。
告訴我如何通過id
加載方法loadInstance();
。我用<f:setPropertyActionListener target="#{accountMB.id}" value="1" />
和 <h:inputHidden id="accountId" value="#{accountMB.id}"/>
。但這是行不通的。請幫幫我。