我正在开发一个Java项目,我对于我偶然发现的情况感到困惑。
我正在用mac osx山狮开发Mac。我正在使用eclipse并正确配置所有内容,并且已经开发了这种方式很长一段时间没有问题。
我正在使用MySQL和Hibernate与HBM映射文件,我使用Spring通过指示应该使用哪些映射文件将它们联系在一起。最近我尝试向表中添加一个新列,更新了域对象,并更新了hbm映射文件。
现在,我开始收到错误:
'字段列表'中的未知列'dateSent'
即使该列位于我的映射文件中,并且该列位于数据库中,也位于我的域对象中。
然后我删除了它并用Maven重建了所有内容,现在我遇到了一个更奇怪的问题,我的代码删除了对列的所有引用,从数据库中删除了列,并从hbm映射中删除了列文件。但是,我仍然看到Hibernate抛出关于列的错误,好像它仍然存在于我的代码中但不是。即使更奇怪,Hibernate输出也没有显示不正确使用尝试插入有问题的列的记录...请参阅下面的错误:“Hibernate:插入消息(用户ID,内容,位置)值(?,?, ?)” ...
这是我得到的错误:
Hibernate: insert into messages (userid, content, location) values (?, ?, ?)
18:08:19,154 WARN JDBCExceptionReporter:77 - SQL Error: 1054, SQLState: 42S22
18:08:19,155 ERROR JDBCExceptionReporter:78 - Unknown column 'dateSent' in 'field list'
18:08:19,175 ERROR MessageProcessorImpl:724 - org.springframework.dao.InvalidDataAccessResourceUsageException: could not insert: [com.app.domain.Message]; SQL [insert into messages (userid, content, location) values (?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not insert: [com.app.domain.Message]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:629)
... 50 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'dateSent' in 'field list'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2643)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
... 66 more
使用Hibernate的mysql数据库或java应用程序之间是否存在类似缓存的问题?
我已重新启动计算机,执行了Maven clean / Maven安装以刷新所有内容。搜索了我的代码字符串dateSent,并没有在我的代码中找到对该单词的引用,它仍然在抱怨。
任何建议都将不胜感激。
这是HBM文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.app.domain">
<class name="Message" table="messages" >
<id name="messageId" column="messageId">
<generator class="native" />
</id>
<property name="userId" column="userId"/>
<property name="content" column="content"/>
<property name="location" column="location"/>
</class>
</hibernate-mapping>
这是我的域名对象:
package com.app.domain;
import java.util.Date;
import java.util.List;
public class Message {
private long messageId;
private long userId;
private String content;
private String location;
public long getMessageId() {
return messageId;
}
public void setMessageId(long messageId) {
this.messageId = messageId;
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
答案 0 :(得分:0)
我甚至将我的代码库恢复到最后一个稳定版本,我仍然遇到了问题。问题最终是由于引用我删除的字段的表上的历史触发器引起的。
异常消息似乎不准确,表明问题出在我的映射上。