在纯休眠中我可以做到:
Blob blob= Hibernate.getLobCreator(sessionFactory.getCurrentSession()).createBlob(inputStream, len);
如何在 jpa 中执行此操作(使用休眠作为提供者)?
在纯休眠中,我为blob创建了用户类型,它使用了setBinaryStream
准备好的语句。这个解决方案非常适合我,我正在寻找一种将它移植到 JPA 的方法。
在纯休眠中我可以做到:
Blob blob= Hibernate.getLobCreator(sessionFactory.getCurrentSession()).createBlob(inputStream, len);
如何在 jpa 中执行此操作(使用休眠作为提供者)?
在纯休眠中,我为blob创建了用户类型,它使用了setBinaryStream
准备好的语句。这个解决方案非常适合我,我正在寻找一种将它移植到 JPA 的方法。
您可以@Lob
在持久属性 ( Annotation Lob ) 上使用注释:
@Entity
public class MyEntity {
private byte[] content;
...
@Lob
public byte[] getContent() {
return content;
}
public void setContent(byte[] newContent) {
this.content = newContent;
}
}
在您的代码中,您可以使用如下代码转换 byte[] 中的流:
@Transient
public void setContentFromInputStream(InputStream is) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int l = 0;
do {
l = is.read(buff);
if (l > 0)
{
baos.write(buff, 0, l);
}
} while (l > 0);
is.close();
baos.flush();
baos.close();
content = baos.toByteArray();
}
@Lob
注释也可以与 String 一起使用,在这种情况下,您将在 DB 上获得一个CLOB
你必须注意byte[]
避免的大小OutOfMemoryError
。
要仅使用流,您必须依赖特定的 jdbc 供应商实现。例如,如果您使用的是 Hibernate >= 3.6,您可以将 MyEntity.content 的类型更改为 Blob 并编写:
MyEntity entity = new MyEntity();
Session session = (Session)entityManager.getDelegate();
Blob newContent = session.getLobHelper().createBlob(inputStream, len);
entity.setContent(newContent);
我希望这可以帮助你
If what you want is to save any serialized object into a column, set the column type in the database as blob, use the SerializationHelper class provided by Hibernate, and put this code in yout bean class.
class MyBean{
@Column
private byte[] object;
@Transient
public Object getObjectDeserialized() throws IOException, ClassNotFoundException {
if(this.object == null)
return new String(); // or another type
return SerializationHelper.deserialize(this.object);
}
byte[] getObject() {
return this.object;
}
void setObject(byte[] object) {
this.object = object;
}
@Transient
public void setObject(Object obj) throws IOException {
if(obj != null)
this.object = SerializationHelper.serialize((Serializable) obj);
}
}
xxxx也许你可以转移你想做的事。
类 XXXBean{
@Column
private byte[] object;
@Transient
public Object getObjectDeserialized() throws IOException, ClassNotFoundException {
if(this.object == null)
return new String(); // or another type
return SerializationHelper.deserialize(this.object);
}
byte[] getObject() {
return this.object;
}
void setObject(byte[] object) {
this.object = object;
}
@Transient
public void setObject(Object obj) throws IOException {
if(obj != null)
this.object = SerializationHelper.serialize((Serializable) obj);
}
}