- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个对象需要更新,使用以下形式来更新它。我有一个名为 createDate
的属性,我不想在更新记录时更改该属性,因此我没有将其包含在表单中,但是当我提交表单时,它会更改 的值createDate
为 null。
<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 源代码显示了正确的值createDate
但是当我提交表单时它会抛出以下异常。
<input type="hidden" name="user.createDate" value="${user.createDate}"/>
为 createDate 添加隐藏的输入后出现异常
INFO: 2014-02-26 12:37:25,896 - WARN [CommonsLogger.java:60] ognl.MethodFailedException: Method "setCreateDate" failed for object com.myproject.myclasses.User@2d680c36 [java.lang.NoSuchMethodException: com.myproject.myclasses.User.setCreateDate([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1305)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1494)
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85)
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:27)
......
最佳答案
您面临的问题似乎与 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();
}
有关在持久化实体之前更新字段的 Hibernate 监听器的更多信息。如果您想在保留记录之前设置 createDate
字段,您可以使用
@PrePersist
protected void onCreate() {
createDate = new Date();
}
用@PrePersist
和@PreUpdate
注释的方法分别在Hibernate第一次持久化实体或更新实体之前调用。您可以获取更多信息here .
编辑:我注意到您正在使用 Hibernate 的 Session API
。在这种情况下,上面的建议就行不通了。为了让它与您当前的实现一起工作,您应该使用 Hibernate events API .
首先,为必须在持久化之前更新的对象创建一个接口(interface)(类似这样)
public interface Dateable {
void setCreateDate(Date date);
}
修改您的 User
类以实现该接口(interface)。
public class User implements Dateable {
//...
}
然后创建一个 Listener
来监听 Dateable
实体上的 SaveOrUpdateEvent
并修改 create 属性:
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>
关于java - 警告[CommonsLogger.java :60] ognl. MethodFailedException : Method failed for object [java. lang.NoSuchMethodException :([Ljava. lang.String;)],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029798/
对于我的程序,目标是使用一堆接口(interface)并创建一个程序来进行测试并允许用户进行测试。我遇到的具体问题是 IQuestionFactory 接口(interface),它有助于在 Test
我刚刚读到有关反射的内容并决定尝试一下,但我似乎遇到了一个错误,我找不到原因。 我在一个类中得到了以下代码: String hashType = "md5"; Method method = Dige
我正在尝试使用反射来加载一个类的实例。当我尝试这样做时,我没有得到这样的方法异常。我已经检查并检查并重新检查。该构造函数显然确实存在。有人有什么想法吗?我之前在另一个代码基本相同的项目中成功使用过它,
这是连接两个关系的作业, import org.apache.hadoop.mapred.*; import org.apache.hadoop.conf.*; import org.apache.h
我正在尝试反序列化包含方法的 XML 文件。 片段看起来像: XMLDecoder decoder = new XMLDecoder(os); deSerializedObject = de
在我的 POM 中,我添加了依赖项 String 4.2.9.RELEASE、Spring boot 1.5.1.RELEASE 和 FasterXML/jackson 2.8.6,并出现以下错误:
在我的代码中有一个方法应该调用对象的方法doSomething。首先,不知道对象的类是否具有公共(public)方法。到目前为止,我使用了以下代码: try { Method method = c
我有以下具有静态方法的类,该方法采用 Class 类型的参数并生成一个 FunctionDescriptor。 public class NoInputFunctionDescriptorFactor
我正在使用 glassfish 3.1.2.2 服务器和 idea Ultimate Edition 11(在 Ubuntu 12.04 上)。当我部署我的耳朵项目时,有一个异常(exception)
所以我有一个定义了 2 个公共(public)方法的类。当我调用 getDeclaredMethods 时,然后循环结果,打印名称,两者都正确显示。所以不仅该方法存在,而且反射调用也找到了它。 但是当
每当使用 URLClassLoader 动态加载类时,当尝试执行使用自定义数据类型作为参数的方法时,我都会收到 NoSuchMethodException 异常。它查找具有标准类型(如 String
我正在尝试根据类和参数创建类的实例。用于创建此类的方法如下所示: @SuppressWarnings("unchecked") public Plugin instantiatePlugin(
我正在构建一个 JavaFx 应用程序,我想创建一个接收 GridPane 和 Node[] 以及添加到 Pane 中的项目数量的方法。但是,当我调用该方法时,我收到 NoSuchMethodExce
我有一个类如下: public class StreamEventSuccess { private final T event; public StreamEventSuccess(
我们正在开发一个动态类加载器项目,并尝试通过 URLClassLoader 调用动态加载类中的方法。它在 Eclipse 中运行时工作得很好,因此调用和动态加载的类被捆绑到两个不同的 jar 中,然后
我正在使用 Taylor 近似在 Java 中编写正弦函数的递归定义,但在运行代码时得到了 noSuchMethodException。这是我到目前为止所拥有的: public static void
我有一个 Android 应用程序。我正在使用反射来调用 CookieManager 的方法。 我在做什么: if (Build.VERSION.SDK_INT >= 21) { Method
我正在尝试编写一个表单,有一次有 2 个单选按钮询问此人的性别。我想要求至少按下一个按钮,否则他们就会 toast 。它们出现在 activity_main 中:
给出的类奖: public class Award { /* * */ // fields of the class Award() {
我在执行时得到一个NoSuchMethodException: operacionDTO.getClass().getMethod("setPrioridad").invoke(operacionDT
我是一名优秀的程序员,十分优秀!