Hibernate 4: valores persistentes de la columna discriminante InheritanceType.JOINED

Tengo una jerarquía simple de documentos UNIDOS:

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 puede ver, todas las subtablas comparten el mismo ID de la tabla Documentos. Aparte de esoSystemDocuments agrega unbinary_data columna yExternalDocuments no agrega nuevas propiedades. (También tenga en cuenta que hay otras dos subtablas concretas en la jerarquía denotadas por'official' y'individual' que no son relevantes aquí.)

Aquí están las asignaciones para las tablas anteriores:

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

e supone que la última clase se debe asignar al valor de la columna discriminadora de Documentos'external'. Al encontrar entidades a través de EntityManager.find, los discriminadores se devuelven correctamente, en realidad porque los discriminadores de mis datos de prueba se han INSERTADO en la base de datos correctamente.

Ahora utilizo el siguiente código para insertar nuevos documentos / archivos en el sistema a través de JPA y un cargador de archivos:

...

UploadedFile uf = event.getUploadedFile();

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

docService.create(detachedExternalDocument);

Al inspeccionar la base de datos, sin embargo, puedo ver que Hibernate hacen insertar el'external' valor discriminador en elDocuments mesasdiscriminator columna.

Hubo problemas al respecto en el pasado, consultehttps: //hibernate.onjira.com/browse/ANN-14 y más recientemente para Hibernate 4https: //hibernate.onjira.com/browse/HHH-435, por lo que es probable que funcione de esa manera.

Luego encontréhttp: //docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.htm en los documentos actuales de la API de Hibernate 4, pero no funciona (consulte @DiscriminatorOptions en la clase de documento).

¿Cómo puedo hacer que Hibernate 4 inserte los discriminadoresusando anotaciones en bruto?

Not: No quiero asignar la columna discriminadora como una columna normal.

Respuestas a la pregunta(1)

Su respuesta a la pregunta