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

Java Hibernate-一个表包含多个实体?,java,hibernate,lazy-loading,blob,Java,Hibernate,Lazy Loading,Blob,我有一张图片: public class Picture implements java.io.Serializable { private byte[] picEncoded; private String Name; //etc 是否可以将字节[]移动到另一个类,而不在db中创建物理上分开的表?我需要使用一些继承策略吗 编辑 单独实体中的Blob: pojo: public class PictureBlob implements java.io.Seriali

我有一张
图片

public class Picture implements java.io.Serializable {

    private byte[] picEncoded;
    private String Name;
    //etc
是否可以将
字节[]
移动到另一个类,而不在db中创建物理上分开的表?我需要使用一些继承策略吗

编辑

单独实体中的Blob:

pojo

 public class PictureBlob implements java.io.Serializable {
        private Integer pictureBlobId;
        private byte[] blob;
<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>
  <one-to-one class="PictureBlob" constrained="true" name="pictureBlob" fetch="select"/>
hbm:

 public class PictureBlob implements java.io.Serializable {
        private Integer pictureBlobId;
        private byte[] blob;
<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>
  <one-to-one class="PictureBlob" constrained="true" name="pictureBlob" fetch="select"/>

在blob值为null的位置插入记录。

我认为您可以使用如下内容:

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

这可能需要一些编辑,但想法是: 您有一个
图片
类。此类具有类型为
pictureBlob
的属性
name
和属性
pictureBlob


组件
标记表示组件内的属性映射到与
图片
相同的表中。如果您对使用注释而不是hbm感兴趣,可以查看这些注释

,这正好解决了你的目的

是否可以将字节[]移动到另一个类而不创建 物理分隔表(以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>
另请注意:

在和映射上使用
lazy=“true”
加载单个标量值类型的属性(有点奇怪 案例)。需要编译后的持久数据的字节码指令插入 用于注入拦截代码的类。可以在中重写 具有获取所有属性的HQL

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

对“智能”收集行为的收集使用
lazy=“extra”
,即。 某些收集操作,如
size()、contains()、get()、
等,不需要 不触发集合初始化。这只对非常有意义的人是明智的 大量收藏


已编辑。

sqlite没有blob类型。可以剪切类型属性。hibernate将把它计算为已删除的type=“byte[]”。没有更改。您是否已禁用图片类的懒散加载?没有。与其他实体的关联将像往常一样懒散加载。谢谢您的回答!这是可行的,但pictureBlob不是延迟加载的(即使组件标记中有“lazy=”true“)。我是否需要字节码增强以使嵌入对象延迟加载?我想您不需要字节码增强……还有一个注释Basic,我们可以为其指定提取类型。此链接提供了有关嵌入式、可嵌入和基本注释的详细信息。你可以试着把这些结合起来,你就能实现你的想法。。。