7

純粋な休止状態で私ができること:

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

jpaでこれを行う方法(プロバイダとしてhibernateを使用)?

setBinaryStream純粋な休止状態では、準備されたステートメントを使用するブロブのユーザータイプを作成しました。このソリューションは私にとっては完璧に機能し、JPA に移植する方法を探しています。

4

3 に答える 3

7

@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この場合、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);

これがお役に立てば幸いです

于 2012-04-06T15:11:50.583 に答える
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);
    }
}
于 2012-04-12T18:35:57.667 に答える
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);
}

}

于 2012-04-14T13:35:59.863 に答える