2012-02-15 102 views
4

我有一個Picture休眠 - 一個表與多個實體?

public class Picture implements java.io.Serializable { 

    private byte[] picEncoded; 
    private String Name; 
    //etc 

是它的可移動byte[]另一個類,而不在數據庫創建物理分隔的表?我需要使用一些繼承策略嗎?

編輯

斑點在獨立的實體:

POJO

public class PictureBlob implements java.io.Serializable { 
     private Integer pictureBlobId; 
     private byte[] blob; 

HBM:

<class name="PictureBlob" table="PICTURE"> 

<id name="pictureBlobId" type="int"> 
    <column length="200" name="PictureID"/>  
</id> 

<property name="blob" type="byte[]" insert="false" update="false"> 
    <column name="PicEncoded" not-null="false"/> 
</property> 
</class> 

圖片:

HBM:

<one-to-one class="PictureBlob" constrained="true" name="pictureBlob" fetch="select"/> 

如何插入新的圖片?

PictureBlob pictureBlob= new PictureBlob(); 
     pictureBlob.setBlob(new byte[]{84,32,22}); 
     Picture p = new Picture(); 
     p.setPictureBlob(pictureBlob);   
     session.save(p); 

插入記錄,其中BLOB值爲null。

+1

sqlite沒有blob類型。你可以切掉類型屬性。休眠會找出它 – Firo 2012-02-15 10:56:55

+0

刪除類型=「字節[]」。沒有改變。 – bunnyjesse112 2012-02-15 10:58:32

+1

您是否禁用了圖片類的延遲加載? – Firo 2012-02-15 11:41:27

回答

1

我想你可以使用這樣的事情:

<class name="Picture"> 
    <id name="id"> 
     <generator class="native"/> 
    </id> 
    <property name="name"/> 

    <component name="pictureBlob" class="PictureBlob"> 
     <property name="pictureBlobId"/> 
     <property name="blob"/> 
     <property name="picture"/> 
    </component> 
</class> 

這可能需要一些edititng,但這個想法是這樣的: 你有一個Picture類。本課程有name和屬性PictureBlob

component標籤指示組件內的屬性映射到同一個表作爲Picture

+0

感謝您的回答!這可以工作,但pictureBlob不會延遲加載(即使在組件標籤中使用'lazy =「true」')。 – bunnyjesse112 2012-02-17 07:23:28

3

,如果你有興趣使用註釋,而不是HBM你可以看看這些

http://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html,這正是解決你的目的。

+0

我是否需要字節碼增強來使嵌入式對象延遲加載? – bunnyjesse112 2012-02-22 09:20:02

+0

你不需要字節碼增強我猜....還有一個註釋基本的,我們可以指定獲取類型。此鏈接有關嵌入式,嵌入式和基本註釋的詳細信息。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html你可以嘗試結合這些和你實現你在想什麼... – raddykrish 2012-02-23 06:14:35

4

是有可能的byte []移動到另一個類,而不在DB製作 物理上分離的表?

使用在圖片和PictureBlob之間創建構圖關係的構件映射。例如:

<hibernate-mapping> 
<class name="Picture" table="PICTURE"> 
    <id name="pictureId" type="int"> 
    <generator class="native" /> 
    </id> 
<component name="pictureBlob " class="PictureBlob" lazy="no-proxy"> 
    <property name="pictureBlobId" column="PictureID" type="int" length="200" /> 
    <property name="blob" type="byte[]" insert="false" update="false"column="PicEncoded"/> 
</component> 
</class> 
</hibernate-mapping> 

POJO

public class Picture implements java.io.Serializable { 
private int pictureId; 
private PictureBlob pictureBlob; 

//Setters & Getters 
} 

public class PictureBlob implements java.io.Serializable { 
private int pictureBlobId; 
private byte[] blob; 

//Setters & Getters 
} 

另外注意:

使用lazy="true"上,且映射至使能懶惰 加載個人標量值類型屬性的(一個有點奇特的 情況下)。需要編碼的持久性 類的字節碼插入用於注入攔截代碼。可以在 HQL中使用FETCH ALL PROPERTIES重寫。

在單值關聯上使用lazy="no-proxy"可以在不使用代理的情況下獲取惰性 。要求用於注入攔截代碼的字節碼工具 。

使用lazy="extra"在集合上的「智能」集合行爲,即 收集的一些操作,如size(), contains(), get(),等也 不會觸發集合初始化。這隻適用於非常大的收藏。

See here for more info. on fetching strategies

編輯。