Hibernate 4: persistente InheritanceType.JOINED valores da coluna discriminadora

Eu tenho uma hierarquia simples de documentos 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)
);

Como você pode ver todas as sub-tabelas, compartilhe o mesmo ID na tabela Documentos. Fora issoSystemDocuments adiciona umbinary_data coluna eExternalDocuments não adiciona novas propriedades. Observe também que há duas outras sub-tabelas concretas na hierarquia indicada por'official' e'individual' que não são relevantes aqui.)

Aqui estão os mapeamentos para as tabelas acima:

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

A última classe deve ser mapeada para o valor da coluna discriminadora dos Documentos'external'. Ao localizar entidades por meio de EntityManager.find, os discriminadores são retornados corretamente, na verdade, porque os discriminadores dos meus dados de teste foram INSERTOS corretamente no banco de dado

Agora eu uso o código a seguir para inserir novos documentos / arquivos no sistema via JPA e um carregador de arquivos:

...

UploadedFile uf = event.getUploadedFile();

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

docService.create(detachedExternalDocument);

Ao inspecionar o banco de dados, no entanto, posso ver que o Hibernate faz insira o'external' valor discriminador noDocuments tabeladiscriminator column.

Houve problemas sobre isso no passado, consultehttps: //hibernate.onjira.com/browse/ANN-14 e mais recentemente para o Hibernate 4https: //hibernate.onjira.com/browse/HHH-435, então é provável que funcione dessa maneir

Encontreihttp: //docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.htm nos documentos atuais da API do Hibernate 4, mas não funciona (consulte @DiscriminatorOptions na classe Document

Como posso obter o Hibernate 4 para inserir os discriminadores usando anotações brutas?

Not: Não quero mapear a coluna discriminadora como uma coluna regula

questionAnswers(1)

yourAnswerToTheQuestion