Hibernate @DiscriminatorColumn et @DiscriminatorValue problème
J'ai cette classe parent:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "BSEntity")
@DiscriminatorColumn(name = "resourceType", discriminatorType = DiscriminatorType.STRING, length = 32)
public abstract class BaseEntity {
et de la sous-classe
@Entity
@Table(name = "BSCategory")
@DiscriminatorValue("Category")
public class CategoryEntity extends BaseEntity {
Mais quand je lance le programme, j'obtiens l'erreur suivante:
2010-06-03 10:13:54,222 [main] WARN (org.hibernate.util.JDBCExceptionReporter:100) - SQL Error: 1364, SQLState: HY000
2010-06-03 10:13:54,222 [main] ERROR (org.hibernate.util.JDBCExceptionReporter:101) - Field 'resourceType' doesn't have a default value
Toutes les pensées?
Mise à jour:
La base de données est MySQL. J'ai aussi changé la stratégie d'héritage REJOINT au lieu de SINGLE_TABLE. Aider
Une Autre Mise À Jour:
J'ai vu la suite de l'affichage de quelque part et il a l'air très intéressant: http://opensource.atlassian.com/projects/hibernate/browse/ANN-140
Nouvelle Mise À Jour:
Si je devais utiliser SecondaryTable approche, comment pourrais-je procéder?
Dernière mise à Jour: il s'avère que les @Discriminateur chose ne fonctionne pas bien avec hibernate. J'ai utilisé le @SecondaryTable approche et qui a pris soin de ce problème pour moi. Merci à tous pour m'avoir aidé!
Veuillez expliquer de quelle stratégie que vous voulez utiliser (ce n'est pas un choix aléatoire) et ce que le résultat escompté au niveau base de données.
La stratégie que je veux utiliser est le "JOINT" stratégie de l'héritage. Au niveau base de données, je veux avoir le champ appelé "resourceType" renseignée avec la valeur spécifiée (dans ce cas) "Catégorie", ce qui est spécifié dans le @DiscriminatorValue("Catégorie").
Ce que vous êtes désireux devrait fonctionner avec n'importe quel raisonnable implémentation JPA. Certainement DataNucleus SVN fonctionne avec une structure d'héritage avec tous les SGBDR j'ai essayé (y compris MySQL). Peut-être que ce bug devrait être réouvert (si Hibernate est tellement mieux que ces "inférieur implémentations" comme l'auteur de ce logiciel).
OriginalL'auteur user224270 | 2010-06-03
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas un hibernate gourou mais je me demandais si vous avez besoin de la
@DiscriminatorColumn
et@DiscriminatorValue
à tous dans votre exemple. Vous avez déjà la classe de base dans sa propre table, et je suppose que toutes les sous-classes sont aussi dans leurs propres tableaux?Si vous consultez le lien suivant, vous pouvez voir que
InheritanceType.JOINED
n'est pas utilisé avec le régulateur de trucs. Le discriminateur les annotations sont utilisées lorsque vous utilisezInheritanceType.SINGLE_TABLE
.http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168
Je ne comprends toujours pas pourquoi vous avez besoin de le Discriminateur de choses à tous. Qu'il a travaillé avec HSQLDB et pas MySQL montre-moi que vous faites quelque chose de mal. Essayez de supprimer le
@DiscriminatorColumn
etValue
tout à fait. Cela fonctionne?La raison pour laquelle je suis en utilisant le Discriminant pour m'aider à remplir automatiquement les données dans le resourceType champ (qui, en passant, est situé dans le BaseEntity table) chaque fois que je insérer des données dans la CategoryEntity table. Dicriminator est la seule façon que je peux venir avec. Et il semble faire ce que je veux quand j'ai utilisé HSQLDB. Cependant, je suis en train de réaliser la même chose à l'aide de MySQL. Comment?
J'ai enlevé @DiscriminatorColumn et la Valeur tout à fait, et qui ne fonctionne pas non plus.
Vous avez probablement besoin d'ajouter un
@PrimaryKeyJoinColumn(name="xxx")
qui indique à hibernate de champ dans la sous-classeCategoryEntity
correspond à l'id de champ dansBaseEntity
.OriginalL'auteur Gray
De votre base de données de la colonne e valeur par défaut.
Si ce n'est pas adapté, utilisez
hbm2ddl.auto
(mis àupdate
), de sorte que hibernate crée (mises à jour) de la structure qu'il requiert.Mise à JOUR: Aller à votre table et définir manuellement une valeur de toutes les lignes dans cette colonne. Ensuite, redémarrez l'application.
mais je ne veux pas utiliser hbm2ddl.auto=créer. Il sera complètement supprimer la table (qui contient déjà des données là-bas) et de re-créer une nouvelle table avec une structure différente. Ce code fonctionne très bien avec HSQLDB, mais pas pour MySQL. pourquoi?
non, elle ne le laisse pas tomber. Il ne fera que mettre à jour.
Quand je l'ai mis à jour, j'obtiens le même message d'erreur que j'ai posté au début de ce post. En fait je l'avais mis au départ avec hbm2ddl.auto=mise à jour.
voir ma mise à jour..
OriginalL'auteur Bozho