Hibernate 4: сохраняющиеся значения столбца дискриминатора InheritanceType.JOINED

У меня есть простая JOINED иерархия документов:

CREATE TABLE Documents
(
  id INTEGER NOT NULL,
  discriminator ENUM('official','individual','external') NOT NULL,
  file_name VARCHAR(200) NOT NULL,
  PRIMARY KEY (id)
);

CREATE SystemDocuments
(
  id INTEGER NOT NULL,
  binary_data BLOB NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (id) REFERENCES Documents (id)
);

CREATE ExternalDocuments
(
  id INTEGER NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (id) REFERENCES SystemDocuments (id)
);

Как вы можете видеть, все подтаблицы используют один и тот же идентификатор из таблицы Documents. что SystemDocuments добавляет столбец binary_data , а ExternalDocuments не добавляет новых свойств. (Также обратите внимание, что есть две другие конкретные подтаблицы в иерархии, обозначенные »)» официальный " и " индивидуальный ", которые здесь не имеют отношения.)

Вот сопоставления для приведенных выше таблиц:

Document.java :

@Entity
@Table(name = "Documents")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
//@DiscriminatorOptions(force = true) // <-- Hibernate 4-specific annotation not inserting discriminator values
public abstract class Document implements Serializable
{
    @Id
    @Column
    protected Integer id;

    @Column(name = "file_name")
    protected String fileName;

    ...
}

SystemDocument.java :

@Entity
@Table(name = "SystemDocuments")
public abstract class SystemDocument extends Document
{
    @Lob
    @Column(name = "binary_data")
    protected byte[] binaryData;

    ...
}

ExternalDocument.java :

@Entity
@Table(name = "ExternalDocuments")
@DiscriminatorValue(value = "external")
public class ExternalDocument extends SystemDocument
{
    ...
}

Последний класс должно быть отображено в значение столбца дискриминатора документов 'external' . При нахождении объектов через EntityManager.find дискриминаторы возвращаются правильно, на самом деле потому, что дискриминаторы моих тестовых данных были правильно ВСТАВЛЕНЫ в БД.

Теперь я использую следующий код для вставки новых документов / файлов в систему через JPA и загрузчик файлов:

...

UploadedFile uf = event.getUploadedFile();

// set ID, file name, and binary data
ExternalDocument detachedExternalDocument =
    new ExternalDocument(1234567, uf.getName(), uf.getData());

docService.create(detachedExternalDocument);

Однако при проверке БД я вижу, что Hibernate не вставляет ] значение внешнего дискриминатора в столбец дискриминатора таблицы Documents .

В прошлом были проблемы по этому поводу, см. https://hibernate.onjira.com/browse/ANN-140 и совсем недавно для Hibernate 4 https: // hibernate. onjira.com/browse/HHH-4358, так что, скорее всего, это должно работать именно так.

Затем я нашел http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.html в текущей документации API Hibernate 4, но это не так. не работает (см. @DiscriminatorOptions в классе Document).

Как мне заставить Hibernate 4 вставлять дискриминаторы с использованием необработанных аннотаций ?

Примечание : я не хочу отображать столбец дискриминатора как обычный столбец.

10
задан Kawu 20 December 2011 в 13:43
поделиться