首先我的道歉。我不能很清楚地说清楚这个问题。
我有一个基于jsf 2.x + spring数据jpa + hibernate框架构建的Web应用程序。有一个可编辑的dataTable,您可以在其中添加/删除/更新行。当您单击“添加行”按钮时,新的实例汽车对象(实体域模型)被添加到列表中,然后当您按下保存按钮时,它会持久保存到数据库中。很直接。
这是foo.xhtml页面。
<p:panelGrid>
<p:row>
<p:column>....</p:column>
<p:column>
<h:form id="fooForm">
<p:dataTable id="fooTable" var="c" value="#{fooBean.cars}"
editable="true" rows="10" paginator="true">
......
<f:facet name="footer">
<p:commandButton value="Add Row" actionListener="#{fooBean.addCar}"
update="fooTable" process="@this" />
</f:facet>
</p:dataTable>
<p:commandButton value="Save" action="#{fooBean.save}" update="fooTable" process="@this"/>
</h:form>
</p:column>
</p:row>
</p:panelGrid>
这是豆。
@ManaagedBean
@Viewscoped
public FooBean class implements Serializable {
.....
public void addCar() {
....
}
public void save() {
// use spring abstraction layer to persist entity object
}
问题我碰到了:
然而,我遇到的麻烦是我决定从foo.xhtml中删除“保存”按钮并
<p:commandButton value="Save" action="#{fooBean.save}" .../>
从FooBean
中移动addCar()方法中的save()方法public void addCar() {
....
save();
}
当我点击“添加行”按钮时,抛出以下异常,我一直试图理解为什么但到目前为止失败了。
SEVERE: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient valu
e: com.yoon.model.Car.age; nested exception is org.hibernate.PropertyValueException: not
-null property references a null or transient value: com.yoon.model.Car.age
更新自我解释的答案
事实证明这是我的程序错误。当我从表中单击“添加行”时,它应该只处理添加完全输入字段的汽车模型实例并将该对象添加到列表中。但是,当我在通过单击“添加行”按钮触发的addCar方法内部重新定位save方法时,空闲的汽车对象在其中字段全部由hibernate推送到数据库的NULL之前,它允许用户填写所需字段。在表中,这些字段不能为空,因此抛出了上述异常。
我能够实现我的初始目标,即单击“添加行”按钮将捕获用户输入并将汽车实例持久保存到数据库。
删除以下按钮
<p:commandButton value="Save" action="#{fooBean.save}" />
拥有ajax组件。
<p:dataTable ....>
<p:ajax event="rowEdit" listener="#{fooBean.save}" />
....
</p:dataTable>