Hibernate - 一个包含多个实体的表?

时间:2012-02-15 10:51:50

标签: java hibernate lazy-loading blob

我有Picture

public class Picture implements java.io.Serializable {

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

是否可以将byte[]移动到另一个类而不在db中创建物理上分离的表?我需要使用一些继承策略吗?

修改

Blob在单独的实体中:

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的位置插入记录。

3 个答案:

答案 0 :(得分:4)

  

是否可以在不创建的情况下将byte []移动到另一个类   在db?

中物理分隔表

使用组件映射创建Picture和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"和映射以启用延迟   加载单个标量值类型的属性(有点异国情调   案件)。需要编译持久性的字节码检测   用于注入拦截代码的类。可以覆盖   具有FETCH所有属性的HQL。

     

对单值关联使用lazy="no-proxy"以启用延迟   在不使用代理的情况下获取。需要字节码检测   用于注入拦截代码。

     

对集合使用lazy="extra"进行“智能”收集行为,即   一些收集操作,如size(), contains(), get(),等   不会触发集合初始化。这只是非常明智的   大集合。

See here for more info. on fetching strategies

<强>编辑。

答案 1 :(得分:3)

如果您对使用注释而不是hbm感兴趣,可以查看这些

http://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html,这将完全解决您的目的。

答案 2 :(得分: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和属性PictureBlob

component标记表示组件内的属性映射到与Picture相同的表