Постоянни Java обекти в Oracle blob

Имам малък проблем и може би можете да ми помогнете. Това, което се опитвам да направя, е да запазя всеки даден java обект (сериализируем) в blob поле в базата данни.

Целта: Запазете Java обект в Oracle Blob

Начинът: Сериализиране на обекта и създаване на BlobDomain като част от обекта, съпоставен с BLOB поле в база данни

Кодът:

Субектът:

@Entity
@Table(name = "ARGUMENT")
public class Argument implements java.io.Serializable {
    private static final long   serialVersionUID    = 1L;

    @Id @Column(name = "ID")
    private Long                id;

    @Column(name = "B_VALUE")
    private BlobDomain          value;

...
}

Задаване на стойността:

private void createArgument (Serializable argVal) throws RuntimeException {
    // argVal is the object to be stored
    Argument arg = new Argument();
    byte[] bytes = serialize(argVal);
    BlobDomain value = new BlobDomain(bytes);
    arg.setValue(value);
    argumentDao.persist(arg);
}

public byte[] serialize(Object obj) throws IOException, SerialException, SQLException {
    ByteArrayOutputStream bs = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(bs);
    os.writeObject(obj);
    os.close();
    return bs.toByteArray();
}

Грешката: Обектът Argument е правилно сортиран в базата данни (таблица ARGUMENT), но когато се опитам да направя заявка за който и да е ред от таблицата, той хвърля следното изключение:

org.hibernate.type.SerializationException: не може да се десериализира

Някой има ли идея, защо се случва това?

Благодаря предварително!!

Пълен стек:

org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:188)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:211)
    at org.hibernate.type.SerializableType.fromBytes(SerializableType.java:105)
    at org.hibernate.type.SerializableType.get(SerializableType.java:62)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:105)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2124)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1404)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1332)
    at org.hibernate.loader.Loader.getRow(Loader.java:1230)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:603)
    at org.hibernate.loader.Loader.doQuery(Loader.java:724)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    at org.hibernate.loader.Loader.loadCollection(Loader.java:2015)
    at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:59)
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:587)
    at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
    at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1743)
    at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:476)
    at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:867)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:264)
    at org.hibernate.loader.Loader.doList(Loader.java:2228)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
    at org.hibernate.loader.Loader.list(Loader.java:2120)
    at org.hibernate.hql.classic.QueryTranslatorImpl.list(QueryTranslatorImpl.java:935)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67)
    ... 38 more
Caused by: java.io.StreamCorruptedException: invalid stream header
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:764)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:277)
    at org.hibernate.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:223)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:180)
    ... 67 more

person Emiliano Schiano    schedule 17.11.2014    source източник


Отговори (1)


Трябва да добавите анотация

@Lob


import javax.persistence.Lob;

@Column(name = "B_VALUE")
@Lob
private BlobDomain          value;

Също така можете да определите дължината на колоната, ако обектът е голям.

@Column(length = 20971520)

@Lob, Указва, че постоянно свойство или поле трябва да се поддържа като голям обект към тип голям обект, поддържан от база данни.

person Ankur Singhal    schedule 17.11.2014
comment
Благодаря за бързата реакция. Ще опитам това и ще ви кажа дали работи. Благодаря отново. - person Emiliano Schiano; 17.11.2014
comment
ankur-singhal Благодаря ви много. Анотацията си свърши работата! - person Emiliano Schiano; 17.11.2014