2010-06-03 4 views
3

j'ai cette classe mère:Mise en veille prolongée et @DiscriminatorColumn question @DiscriminatorValue

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "BSEntity") 
@DiscriminatorColumn(name = "resourceType", discriminatorType = DiscriminatorType.STRING, length = 32) 
public abstract class BaseEntity { 

et la sous-classe

@Entity 
@Table(name = "BSCategory") 
@DiscriminatorValue("Category") 
public class CategoryEntity extends BaseEntity { 

Mais quand je lance le programme, je reçois 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 

Des pensées?

Mis à jour: La base de données est MySQL. J'ai également changé la stratégie d'héritage à JOINED au lieu de SINGLE_TABLE. Aide

Une autre mise à jour: j'ai vu l'affichage suivant quelque part et il semble très intéressant: http://opensource.atlassian.com/projects/hibernate/browse/ANN-140

Nouvelle mise à jour: Si je devais utiliser l'approche SecondaryTable, comment pourrais-je procéder alors?

Mise à jour finale: il s'avère que la chose @Discriminator ne fonctionne pas bien avec hibernate. J'ai utilisé l'approche @SecondaryTable et qui a pris soin de ce problème pour moi. Merci à tous pour m'avoir aidé!

+0

Quelle est la base de données? – Bozho

+0

Veuillez expliquer quelle stratégie vous voulez utiliser (ce n'est pas un choix aléatoire) et quel est le résultat attendu au niveau de la base de données. –

+0

La stratégie que je souhaite utiliser est la stratégie d'héritage "JOINED". Au niveau de la base de données, je souhaite que le champ appelé "resourceType" soit rempli avec la valeur "Category" spécifiée dans @DiscriminatorValue ("Category"). – user224270

Répondre

0

Définissez la valeur par défaut de la colonne de la base de données.

Si cela ne vous convient pas, utilisez hbm2ddl.auto (défini sur update) pour qu'Hibernate crée (met à jour) la structure dont il a besoin.

MISE À JOUR: Accédez à votre table et définissez manuellement une valeur pour toutes les lignes existantes dans cette colonne. Puis redémarrez votre application.

+0

Eh bien, et si je ne veux vraiment pas avoir cette colonne par défaut à une certaine valeur? la valeur devrait vraiment changer. – user224270

+0

mais je ne veux pas utiliser hbm2ddl.auto = create. Il supprimera complètement la table (qui contient déjà des données) et recrée une nouvelle table avec une structure différente. Ce code fonctionne bien avec HSQLDB, mais pas pour MySQL. Pourquoi? – user224270

+0

non, il ne le laissera pas tomber. Cela ne fera que le mettre à jour. – Bozho

2

Je ne suis pas un gourou hibernation mais je me demande si vous avez besoin du @DiscriminatorColumn et @DiscriminatorValue du tout dans votre exemple. Vous avez déjà la classe de base dans sa propre table et je suppose que toutes les sous-classes sont également dans leurs propres tables?

Si vous consultez le lien suivant, vous pouvez voir que InheritanceType.JOINED n'est pas utilisé avec le discriminateur. Les annotations de discriminateur sont utilisées lorsque vous utilisez InheritanceType.SINGLE_TABLE.

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168

+0

Mais cette stratégie a fonctionné avec HSQLDB, pourquoi pas pour MySQL? J'attribue la valeur par défaut à quelque chose, alors ça a bien fonctionné, mais je ne veux pas ça, je veux que la valeur soit remplie dynamiquement pour ce champ – user224270

+0

Je ne comprends toujours pas pourquoi vous avez besoin du programme Discriminator. avec HSQLDB et pas MySQL me montre que vous êtes en train de faire quelque chose de mal Essayer de supprimer les '@ DiscriminatorColumn' et' Value' complètement.Cela fonctionne? – Gray

+0

La raison pour laquelle j'utilise Discriminator est de m'aider à remplir automatiquement les données dans le champ resourceType (qui, soit dit en passant, se trouve dans la table BaseEntity) chaque fois que j'insère des données dans la table CategoryEntity, Dicriminator est le seul moyen que je puisse trouver. semble faire ce que je veux quand j'ai utilisé HSQLDB. Cependant, j'essaye de réaliser la même chose en utilisant MySQL. Comment? – user224270

Questions connexes