2014-05-05 44 views
1

我試圖改變從字節[]模式我的檔案實體團塊。檢票和Hibernate實體與斑點

原始代碼:

@Entity 
@Table(name="raw_data") 
public class RawDataEntity extends DomainObject { 
    @Lob 
    private byte[] data; 

新代碼:

@Entity 
@Table(name="raw_data") 
public class RawDataEntity extends DomainObject { 

    @Lob 
    private Blob data; 

它工作正常,但我需要使用這個實體Seriazable - 在Wicket頁面使用.. (我不能使用DetachableModel或刪除序列化,因爲,有哪些必須序列休眠實體的大型模型..)

希望你們可以幫助我。

回答

2

可以使斑點短暫的,那麼它將不會被序列化,但是這將是空在反序列化:

private transient Blob data; 

我認爲你唯一的選擇是創建一個單獨的對象爲BLOB,只在RawDataEntity中引用它並使用LoadableDetachableModel根據請求重新加載它。

public class BlobModel extends LoadableDetachableModel<Blob> { 

    private int id; 

    public BlobModel(int id) { 
     this.id = id; 
    } 

    @Override 
    protected Blob load() { 
     return dao.getObject(id); 
    } 
} 

另一個選項是更改無法序列化頁面的序列化。首先創建一個接口,用於這些頁面:

public interface CustomSerialize { 
    Serializable getSerializable(Object object); 
    Object getUnserializable(Object object); 
} 

下一頁創建您自己的序列:

public class CustomSerializer extends JavaSerializer { 
public CustomSerializer(String applicationKey) { 
    super(applicationKey); 
} 

@Override 
public byte[] serialize(Object object) { 
    if (object instanceof CustomSerialize) { 
     super.serialize(((CustomSerialize) object).getSerializable(object)); 
    } 
    return super.serialize(object); 
} 

@Override 
public Object deserialize(byte[] data) { 
    Object object = super.deserialize(data); 
    if (object instanceof CustomSerialize) { 
     return ((CustomSerialize) object).getUnserializable(object); 
    } 
    return object; 
} 
} 

然後在網頁上的接口不能被序列化並寫出兩種方法。 getSerializable()應創建一個實現CustomSerializer的對象,以便getUnserializable()返回相同的頁面。

和最後,使用新的串行在檢票口的WebApplication:

getFrameworkSettings().setSerializer(new CustomSerializer(getApplicationKey())); 
+0

是堅持一個領域Hibernate中使用臨時關鍵字?如果我沒有理解Hibernate實現JPA的,它不堅持瞬態字段或瞬態標註的字段,以及在http://stackoverflow.com/questions/3976469/is-hibernate-jpa-taking-in-consideration-the-描述transiant-modifier-not-anno –

+0

是的,瞬態也意味着它不會被持續。是否有可能以任何方式更改實體?由於Blob對象不能被序列化,所以你必須改變某個地方。爲什麼你不能爲整個實體使用Loadable模型? – Martin

+0

LoadableDetachableModel不解決持久性問題。如果一個對象被hibernate持久化(使用hibernate版本控制),所有的字段都被hibernate持久/管理。 –