Hibernate 4: la persistance des InheritanceType.REJOINT le discriminant de valeurs de la colonne

J'ai un simple JOINT hiérarchie de documents:

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

Comme vous pouvez le voir tous les sous-tableaux de faire est de partager le même ID à partir du tableau des Documents. Autres que que SystemDocuments ajoute un binary_data colonne et ExternalDocuments n'ajoute pas de nouvelles propriétés. (À noter également que deux autres de béton sous les tables dans la hiérarchie désignée par 'official' et 'individual' qui ne sont d'aucune pertinence ici.)

Voici les correspondances pour les tableaux ci-dessus:

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

La dernière classe est censé être mappés à des Documents discriminateur de la valeur de la colonne 'external'. Lors de la recherche des entités via l'EntityManager.trouver les discriminateurs sont retournés correctement, eh bien en fait parce que les discriminateurs de mes données de test ont été Insérés dans la base correctement.

Maintenant, j'utilise le code suivant pour insérer de nouveaux documents/fichiers dans le système via JPA et un fichier uploader:

...

UploadedFile uf = event.getUploadedFile();

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

docService.create(detachedExternalDocument);

Lors de l'inspection du DB cependant, je peux voir qu'Hibernate ne pas insérer le 'external' discriminateur de valeur dans le Documents table discriminator colonne.

Il y a eu des questions à ce sujet dans le passé, voir https://hibernate.onjira.com/browse/ANN-140 et, plus récemment, pour Hibernate 4 https://hibernate.onjira.com/browse/HHH-4358, alors les chances sont que c'est censé être de cette façon.

J'ai ensuite trouvé http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.html dans le courant Hibernate 4 de l'API Docs, mais il ne fonctionne pas (voir @DiscriminatorOptions à la classe de Document).

Comment puis-je obtenir Hibernate 4, à insérer les discriminateurs à l'aide de matières annotations?

Note: je ne veux pas la carte de la colonne discriminante comme une chronique régulière.

OriginalL'auteur Kawu | 2011-11-02