Hibernate + Informix + Blob +字节数组 [英] Hibernate + Informix + Blob + byte array
问题描述
我有麻烦保存一个字节数组到我的Informix数据库,我会告诉你我是如何尝试的:
在Fichero.java和其他东西中,我有这:
@Column(name =fichero,columnDefinition =blob)
private byte [] contenido ;
我必须这样做,因为我无法让Informix + Hibernate接受@Lob注释(是的,我试图扩展Hibernate的方言解决方法,但它不适用于我)
然后我读取一个文件并将其转换为bytearray这样:FileManager.java
private byte [] fromFile2ByteArray(String nombreFichero)throws FileNotFoundException,IOException {
File file = new文件(nombreFichero);
InputStream is = new FileInputStream(file);
byte [] contenido = new byte [(int)file.length()];
is.read(contenido);
is.close();
返回contenido;
}
接下来我尝试将它保存到我的数据库中:
FicheroDAO.java
public void save(Object object){
getHibernateTemplate()。save(object);
}
其中对象是我的Fichero对象。
Buuuuut,我得到以下异常。
Hibernate:
/ * insert es。 cosas.modelo.datos.dominio.fichero.Fichero
* /插入
到
cosas_fichero
(fichero,idEnvio,nombrefichero,respuesta)
值
(?,?,?,?)
WARN:org.hibernate.util.JDBCExceptionReporter - SQL错误:-841,SQLState:S0000
错误:org.hibernate.util.JDBCExceptionReporter - 名称必须以一个字母或'_'并包含字母,数字或'_'。
22-Jun-2012 9:25:32 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE:Servlet.service()para servlet Spring MVC调度程序Servletlanzóexcepción
java.sql .SQLException:名称必须以字母或'_'开头并包含字母,数字或'_'。
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:379)
at com.informix.jdbc.IfxSqli.addException(IfxSqli.java:3109)
at com.informix .jdbc.IfxSqli.receiveError(IfxSqli.java:3419)
在com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2282)
在com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli .java:2202)
,位于com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5475) b在com.informix.jdbc.IfxSmartBlob.IfxLoColInfo(IfxSmartBlob.java:306)
at com.informix.jdbc.IfxSmBlob.createSmartLob(IfxSmBlob.java:751)
at com.informix.jdbc。 IfxSmBlob.createBlobOnServer(IfxSmBlob.java:497)
在com.informix.jdbc.IfxResultSet.executeUpdate(IfxResultSet.java:301)
在com.informix.jdbc.IfxStatement.executeUpdateImpl(IfxStatement.java: 885)
at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:279)
at org.ap ache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
在org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
。在组织。 hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
处org.hibernate.persister org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
。 entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2836)
在org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
在org.hibernate.engine.ActionQueue.execute(ActionQueue。 Java的:267),美元,org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321 b $ b)
在org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
在org.hibernate.event.def.AbstractSave EventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId( DefaultSaveEventListener.java:56)
在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
在org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java: 50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
在org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
在org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
在org.springframework.orm.hibernate3 .HibernateTemplate $ 12.doInHibernate杆菌(Hib ernateTemplate.java:686)
at org.springframework.orm.hibernate3.HibernateTemplate $ 12.doInHibernate(HibernateTemplate.java:1)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java :406)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
异常中的下一行指向FicheroDAO.java文件,并在其中尝试保存对象...
有什么想法?
最后,我想出了一个更简单的解决方法:我只是将数据库中的列定义为字节......并且它的工作方式就像是一个魅力......反正总是......
I have troubles saving a byte array to my Informix database, I'll show you how I'm trying:
In Fichero.java among other things I have this:
@Column(name="fichero", columnDefinition="blob")
private byte[] contenido;
I had to do that way because I can't get Informix+Hibernate to accept @Lob annotation (yes, I tried that extending Hibernate's dialect workaround but it doesn't work for me)
Then I read a file and convert it to a bytearray this way: FileManager.java
private byte[] fromFile2ByteArray(String nombreFichero) throws FileNotFoundException, IOException{
File file = new File(nombreFichero);
InputStream is = new FileInputStream(file);
byte[] contenido = new byte[(int)file.length()];
is.read(contenido);
is.close();
return contenido;
}
And next I try to save it to my database using: FicheroDAO.java
public void save(Object object) {
getHibernateTemplate().save(object);
}
where the object is my Fichero object.
Buuuuut, I get the following exception.
Hibernate:
/* insert es.cosas.modelo.datos.dominio.fichero.Fichero
*/ insert
into
cosas_fichero
(fichero, idEnvio, nombrefichero, respuesta)
values
(?, ?, ?, ?)
WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: -841, SQLState: S0000
ERROR: org.hibernate.util.JDBCExceptionReporter - Name must start with a letter or '_' and contain letters, digits, or '_'.
22-jun-2012 9:25:32 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() para servlet Spring MVC Dispatcher Servlet lanzó excepción
java.sql.SQLException: Name must start with a letter or '_' and contain letters, digits, or '_'.
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:379)
at com.informix.jdbc.IfxSqli.addException(IfxSqli.java:3109)
at com.informix.jdbc.IfxSqli.receiveError(IfxSqli.java:3419)
at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2282)
at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2202)
at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5475)
at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5400)
at com.informix.jdbc.IfxSmartBlob.IfxLoColInfo(IfxSmartBlob.java:306)
at com.informix.jdbc.IfxSmBlob.createSmartLob(IfxSmBlob.java:751)
at com.informix.jdbc.IfxSmBlob.createBlobOnServer(IfxSmBlob.java:497)
at com.informix.jdbc.IfxResultSet.executeUpdate(IfxResultSet.java:301)
at com.informix.jdbc.IfxStatement.executeUpdateImpl(IfxStatement.java:885)
at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:279)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2836)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:267)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:686)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:1)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
The next line in the exception points to FicheroDAO.java file and the line number where it tries to save the object...
Any ideas?
Well in the end I figured out a more simple workaround: I just defined the column in the DB as byte... and it works like a charm... Thanx anyway..
这篇关于Hibernate + Informix + Blob +字节数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!