WARN [CommonsLogger.java:60] ognl.MethodFailedException:对象的方法失败[java.lang.NoSuchMethodException:([Ljava.lang.String;]]

时间:2014-02-26 01:23:17

标签: java hibernate struts2 ognl

我有一个需要更新的对象,以下表单用于更新它。 我有一个名为createDate的属性,我不想在更新记录时进行更改,因此我没有将其包含在表单中,但是当我提交表单时,它会将createDate的值更改为空。

<s:form method="POST" autocomplete="on" action="update">
    <input type="hidden" name="user.id" value="${user.id}"/>
   ....
</s:form>

代码

final Session session = HibernateUtil.getSession();
try {
    final Transaction tx = session.beginTransaction();
    try {
        session.update(user);
        if (!tx.wasCommitted()) {    
            tx.commit();
        }
        return "SUCCESS";
    } catch (Exception e) {
        tx.rollback();
        e.printStackTrace();
        return "Failed";
    }
} finally {
    HibernateUtil.closeSession();
}

用户类

....
@Column(name = "createdate")
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
public Date getCreateDate() {
    return createDate;
}

public void setCreateDate(Date createDate) {
    this.createDate = createDate;
}

我认为它将值更改为null,因为该字段尚未包含在表单中,因此我将以下代码添加到表单中,尽管页面的HTML源显示{{1的正确值但是当我提交表单时,它会抛出异常。

createDate

添加为createDate隐藏的输入

后出现异常
<input type="hidden" name="user.createDate" value="${user.createDate}"/>

1 个答案:

答案 0 :(得分:2)

您面临的问题似乎与setCreateDate()期待的论点有关。由于您的方法声明为setCreateDate(Date),因此与setCreateDate(String)不兼容,预计在提交表单时会调用该Id

要更新当前模型对象,您必须使用提交的session.update()从数据库中检索它,更新相关字段,然后调用public void updateUserInfo(User user) { Session s = getSession(); Transaction t = s.beginTransaction(); User u = (User) s.load(User.class, user.getId()); u.setAddress(user.getAddress()); u.setEmail(user.getEmail()); s.update(u); t.commit(); closeSession(); } 。你的代码看起来像

createDate

有关Hibernate侦听器的更多信息,可以在持久化实体之前更新字段。 如果要在记录保留之前设置@PrePersist protected void onCreate() { createDate = new Date(); } 字段,可以使用

@PrePersist

使用@PreUpdateSession API注释的方法在Hibernate首次持久保存实体或分别更新之前调用。您可以获得更多信息here

编辑:我注意到你正在使用Hibernate的public interface Dateable { void setCreateDate(Date date); } 。在这种情况下,上述建议将无效。为了使其与您当前的实现一起使用,您应该使用Hibernate events API

首先,为持久化之前必须更新的对象创建一个接口(类似这样)

User

修改您的public class User implements Dateable { //... } 类以实现该接口。

Listener

然后创建一个SaveOrUpdateEvent来监听Dateable实体上的import org.hibernate.event.SaveOrUpdateEvent; import org.hibernate.event.def.DefaultSaveOrUpdateEventListener; public class SaveOrUpdateDateListener extends DefaultSaveOrUpdateEventListener { @Override public void onSaveOrUpdate(SaveOrUpdateEvent event) { if (event.getObject() instanceof Dateable) { Dateable record = (Dateable) event.getObject(); record.setCreateDate(new Date()); } super.onSaveOrUpdate(event); } } 并修改创建属性:

hibernate.cfg.xml

最后,通过<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> ..... <event type="save-update"> <listener class="SaveOrUpdateDateListener"/> </event> </session-factory> </hibernate-configuration>

配置上述监听器
{{1}}