gpt4 book ai didi

hibernate - 使用 hibernate 将 blob 保存到数据库

转载 作者:行者123 更新时间:2023-12-04 08:18:12 24 4
gpt4 key购买 nike

我尝试使用 blob 和 hibernate3 将文件保存到 MySQL。但我总是有
java.lang.UnsupportedOperationException:Blob 可能无法通过创建 session 进行操作
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>

请帮帮我。我错在哪里?

最佳答案

如果您查看 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");

关于hibernate - 使用 hibernate 将 blob 保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com