我尝试使用带有hibernate3的blob将文件保存到MySQL。但我一直都有 java.lang.UnsupportedOperationException:可能无法通过创建会话来操作Blob org.hibernate.lob.BlobImpl.excep(BlobImpl.java:127)
这里有一些代码。
package com.uni.domain;
public class File extends Identifier {
private byte[] data;
private String contentType;
public byte[] getData() {
return data;
}
public File() {}
public void setData(byte[] photo) {
this.data = photo;
}
public boolean isNew() {
return true;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
}
package com.uni.domain;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.sql.*;
import java.util.Arrays;
public class PhotoType implements UserType {
public int[] sqlTypes() {
return new int[]{Types.BLOB};
}
public Class returnedClass() {
return byte[].class;
}
public boolean equals(Object o, Object o1) throws HibernateException {
return Arrays.equals((byte[]) o, (byte[]) o1);
}
public int hashCode(Object o) throws HibernateException {
return o.hashCode();
}
public Object nullSafeGet(ResultSet resultSet, String[] strings, Object o) throws HibernateException, SQLException {
Blob blob = resultSet.getBlob(strings[0]);
return blob.getBytes(1, (int) blob.length());
}
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
st.setBlob(index, Hibernate.createBlob((byte[]) value));
}
public Object deepCopy(Object value) {
if (value == null) return null;
byte[] bytes = (byte[]) value;
byte[] result = new byte[bytes.length];
System.arraycopy(bytes, 0, result, 0, bytes.length);
return result;
}
public boolean isMutable() {
return true;
}
public Serializable disassemble(Object o) throws HibernateException {
return null; .
}
public Object assemble(Serializable serializable, Object o) throws HibernateException {
return null; .
}
public Object replace(Object o, Object o1, Object o2) throws HibernateException {
return null; .
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.uni.domain">
<class name="com.uni.domain.File">
<id name="id">
<generator class="native"/>
</id>
<property name="data" type="com.uni.domain.FleType"/>
<property name="contentType"/>
</class>
</hibernate-mapping>
请帮帮我。哪里我错了?
答案 0 :(得分:4)
如果你看一下 BlobImpl 的hibernate源代码,你会发现 getBytes 方法没有实现,只转发到异常:
69 /**
70 * @see java.sql.Blob#getBytes(long, int)
71 */
72 public byte[] getBytes(long pos, int len) throws SQLException {
73 excep(); return null;
74 }
126 private static void excep() {
127 throw new UnsupportedOperationException("Blob may not be manipulated from creating session");
128 }
129
而不是 getBytes ()你应该使用 getBinaryStream ()
使用示例:
InputStream inputStream = getContent().getBinaryStream();
int expected = inputStream.available();
byte[] contents = new byte[expected];
int length = inputStream.read(contents);
if(length != expected)
throw new IOException("Could not read full input");
答案 1 :(得分:2)
如果您在Spring中使用它,那么Spring中就有内置支持。 DefaultLobHandler这是配置的问题,让它工作。引用Sample Code,与旧版本的Spring相比没有太大变化。