com.quelque chose.SuperClass:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable {
private static final long serialVersionUID = -695503064509648117L;
long confirmationCode;
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
public long getConfirmationCode() {
return confirmationCode;
}
public void setConfirmationCode(long confirmationCode) {
this.confirmationCode = confirmationCode;
}
}
com.quelque chose.Sous-classe:
@Entity
public abstract class Subclass extends SuperClass {
private static final long serialVersionUID = 8623159397061057722L;
String name;
@Column(nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Me donne cette exception:
Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass
Quel est le moyen le meilleur et le plus pratique pour moi de générer les identifiants? Je ne veux pas changer ma stratégie de succession.
hibernate
inheritance
jpa
class-table-inheritance
Martijn Pieters
la source
la source
Je me demande s'il s'agit d'un problème spécifique à un dialecte de base de données, depuis que j'ai regardé un tutoriel youtube avec PostgreSQL comme base de données sous-jacente, j'ai vu que le créateur de la vidéo exécutait avec succès une application avec la valeur par défaut @GeneratedValue. Dans mon cas (la base de données sous-jacente est MySQL), j'ai dû modifier la stratégie @GeneratedValue en GenerationType.TABLE exactement comme le propose zoidbeck.
Voici la vidéo: https://www.youtube.com/watch?v=qIdM4KQOtH8
la source
GenerationType.SEQUENCE
. C'est pourquoi cela fonctionne automatiquement là-bas. Cela n'a absolument rien à voir avec PostgreSQLsINHERITS
.D'accord avec la réponse de zoidbeck. Vous devez changer de stratégie pour:
Mais ce n'est pas tout, vous devez créer une nouvelle table, ce qui contiendra la séquence de clés primaires de votre table abstraite. Modifiez votre mappage en
Et une nouvelle table dans la base de données devrait ressembler à ceci:
Lorsque vous avez exécuté votre application, Hibernate insérera une ligne où
sequence_name
sera le nom de l'entité (SuperClass
dans cet exemple) et lasequence_next_hi_value
valeur sera automatiquement incrémentée et utilisée pour les nouveaux enregistrements de toutes les tables des sous-classes implémentées.la source
Dans notre cas, nous utilisons une base de données PostreSQL pour le développement et la production et une base de données hsqldb en mémoire pour les tests. Nous utilisons une séquence dans les deux cas pour générer un identifiant. Apparemment, la valeur par
GenerationType.AUTO
défaut estSEQUENCE
pour postgres, mais a échoué dans nos tests locaux (doit par défaut être quelque chose d'autre pour hsqldb).Donc, la solution qui a fonctionné pour nous, utilisez explicitement
GenerationType.SEQUENCE
.la source
vous pouvez utiliser @MappedSuperclass pour l'héritage
la source
Il existe une conformité standard SQL entre MySQL et PostgreSQL. PostgreSQL Postgres comprend un bon sous-ensemble de SQL92 / 99 ainsi que certaines fonctionnalités orientées objet de ces sous-ensembles. Postgres est capable de gérer des routines et des règles complexes sous forme de requêtes SQL déclaratives, de sous-requêtes, de vues, de prise en charge multi-utilisateur, de transactions, d'optimisation de requête, d'héritage et de tableaux. Ne prend pas en charge la sélection de données dans différentes bases de données.
MySQL MySQL utilise SQL92 comme base. Fonctionne sur d'innombrables plates-formes. Mysql peut construire des requêtes qui peuvent joindre des tables à partir de différentes bases de données. Prend en charge les jointures externes gauche et droite à l'aide de la syntaxe ANSI et ODBC. À partir de MySQL 4.1 à partir de cette version, MySQL gérera les sous-requêtes. Vues prises en charge à partir de la version 5.
Pour une description détaillée, veuillez visiter. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html
la source