Hibernate - одна таблица с несколькими объектами? - PullRequest
4 голосов
/ 15 февраля 2012

У меня есть Picture:

public class Picture implements java.io.Serializable {

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

Можно ли переместить byte[] в другой класс без создания физически разделенной таблицы в БД?Нужно ли использовать какую-то стратегию наследования?

edit

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-объекта равно нулю.

Ответы [ 3 ]

4 голосов
/ 24 февраля 2012

Можно ли переместить 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" on и сопоставления для включения отложенной загрузки отдельных скалярных значений-типизированные свойства (несколько экзотический случай).Требуется инструментарий байт-кода скомпилированных постоянных классов для внедрения кода перехвата.Может быть переопределено в HQL с помощью FETCH ALL PROPERTIES.

Используйте lazy="no-proxy" для однозначных ассоциаций, чтобы включить отложенную выборку без использования прокси.Требуется инструментарий байт-кода для внедрения кода перехвата.

Использование lazy="extra" в коллекциях для «умного» поведения коллекции, т.е. некоторые операции сбора, такие как size(), contains(), get(), и т. Д., Не инициируют инициализацию коллекции.Это имеет смысл только для очень больших коллекций.

Смотрите здесь для получения дополнительной информации.при выборе стратегии

Отредактировано.

3 голосов
/ 22 февраля 2012

если вы заинтересованы в использовании аннотаций вместо hbm, вы можете взглянуть на эти

http://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html, это точно решит вашу цель.

1 голос
/ 17 февраля 2012

Я думаю, вы могли бы использовать что-то вроде этого:

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

Это может потребовать некоторого редактирования, но идея такова: у вас есть класс Picture.Этот класс имеет свойство name и свойство pictureBlob типа PictureBlob.

. Тег component указывает, что свойства внутри компонента сопоставлены с той же таблицей, что и Picture

...