2012-02-15 13 views
4

私が持っているPictureHibernate - 複数のエンティティを持つ1つのテーブル?

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型がありません。 type属性を削除することができます。 hibernateはそれを把握します – Firo

+0

削除されたタイプ= "バイト[]"。何も変わっていません。 – bunnyjesse112

+1

Pictureクラスのlazyloadingを無効にしましたか? – Firo

答えて

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クラスを持っています。このクラスは、タイプPictureBlobのプロパティnameとプロパティpictureBlobを持っています。

componentタグは、これは正確でしょう、あなたの代わりにHBMのアノテーションを使用してに興味がありますが、これらの

http://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.htmlを見てみることができるかどうかのコンポーネントの内部プロパティがPicture

+0

お返事ありがとうございます!これは動作しますが、pictureBlobは遅延ロードされません(コンポーネントタグで 'lazy = "true"'を指定しても)。 – bunnyjesse112

3

と同じテーブルにマッピングされていることを示しあなたの目的を解決する。

+0

埋め込みオブジェクトを遅延読み込みするためにバイトコードの拡張が必要ですか? – bunnyjesse112

+0

バイトコードの拡張が必要な​​いと思います....もう1つのアノテーションがあります。基本はフェッチタイプを指定できます。このリンクには、埋め込み、埋め込み、および基本アノテーションに関する広範な詳細があります。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.htmlあなたはそれらを組み合わせて、あなたが思っていることを達成することができます... – raddykrish

4

は、それがデシベルで 物理的に分離テーブルを作成することなく、別のクラスに[]バイトを移動することが可能ですか?

PictureとPictureBlobの間の構図関係を作成するコンポーネントマッピングを使用します。例:

使用lazy="true"にし、そして個々のスカラー値型付けされたプロパティの遅延 ローディング(幾分エキゾチック ケースを有効にするマッピング:

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

また注意)。インターセプトコードの注入のために、コンパイルされた永続的な クラスのバイトコードインストルメンテーションが必要です。 FETCH ALL PROPERTIESのある HQLでオーバーライドできます。

単一値のアソシエーションでlazy="no-proxy"を使用すると、遅延のある をプロキシを使用せずに取得できます。傍受コードを注入するためのバイトコード計装 が必要です。などsize(), contains(), get(),として「スマート」コレクションの動作のためのコレクションの

使用 lazy="extra"、すなわち いくつかのコレクション操作は コレクションの初期化を誘発しません。これは大規模なコレクション の場合にのみ賢明です。

See here for more info. on fetching strategies

編集。