JPA - 来自hibernate的LobCreator的类比?

时间:2012-04-06 11:22:52

标签: java hibernate java-ee jpa

在纯Hibernate我能做到:

Blob blob= Hibernate.getLobCreator(sessionFactory.getCurrentSession()).createBlob(inputStream, len);

如何在jpa中使用hibernate作为提供者?

在纯hibernate中,我为blob创建了用户类型,它使用了setBinaryStream预处理语句。这个解决方案非常适合我,我正在寻找一种方法将它移植到JPA。

3 个答案:

答案 0 :(得分:7)

您可以在持久属性(Annotation Lob)上使用@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一起使用,在这种情况下,你将在数据库上获得一个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);

我希望这可以帮到你

答案 1 :(得分:1)

如果您想要将任何序列化对象保存到列中,请将数据库中的列类型设置为blob,使用Hibernate提供的SerializationHelper类,并将此代码放在yout bean类中。

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);
    }
}

答案 2 :(得分:0)

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);
}

}