com.something.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.something.SubClass:
@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;
}
}
Gibt mir diese Ausnahme:
Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass
Was ist der beste und bequemste Weg für mich, die IDs zu generieren? Ich möchte meine Vererbungsstrategie nicht ändern.
hibernate
inheritance
jpa
class-table-inheritance
Martijn Pieters
quelle
quelle
Ich frage mich, ob dies ein datenbankdialektspezifisches Problem ist, da ich beim Betrachten eines YouTube-Tutorials mit PostgreSQL als zugrunde liegender Datenbank festgestellt habe, dass der Ersteller des Videos erfolgreich eine App mit dem Standardwert @GeneratedValue ausführt. In meinem Fall (die zugrunde liegende Datenbank ist MySQL) musste ich die @ GeneratedValue-Strategie genau wie von zoidbeck vorgeschlagen in GenerationType.TABLE ändern.
Hier ist das Video: https://www.youtube.com/watch?v=qIdM4KQOtH8
quelle
GenerationType.SEQUENCE
. Deshalb funktioniert es dort automatisch. Es hat absolut nichts mit PostgreSQLs zu tunINHERITS
.Stimmen Sie der Antwort von Zoidbeck zu. Sie müssen die Strategie ändern in:
Aber das ist noch nicht alles. Sie müssen eine neue Tabelle erstellen, die die Primärschlüsselfolge der Tabelle Ihres Abstracts enthält. Ändern Sie Ihre Zuordnung zu
Eine neue Tabelle in der Datenbank sollte folgendermaßen aussehen:
Wenn Sie Ihre Anwendung ausgeführt haben, fügt Hibernate eine Zeile ein, in
sequence_name
der der Entitätsname (SuperClass
in diesem Beispiel) angegeben ist. Dersequence_next_hi_value
Wert wird automatisch erhöht und für neue Datensätze aller Tabellen der implementierenden Unterklassen verwendet.quelle
In unserem Fall verwenden wir eine PostreSQL-Datenbank für Entwicklung und Produktion und eine speicherinterne hsqldb-Datenbank für Tests. In beiden Fällen verwenden wir eine Sequenz, um eine ID zu generieren. Anscheinend
GenerationType.AUTO
standardmäßigSEQUENCE
für Postgres, aber in unseren lokalen Tests fehlgeschlagen (muss für hsqldb standardmäßig etwas anderes sein).Also die Lösung, die für uns funktioniert hat, explizit verwenden
GenerationType.SEQUENCE
.quelle
Sie können @MappedSuperclass für die Vererbung verwenden
quelle
Zwischen MySQL und PostgreSQL besteht eine SQL-Standardkonformität. PostgreSQL Postgres versteht eine gute Teilmenge von SQL92 / 99 sowie einige objektorientierte Funktionen dieser Teilmengen. Postgres kann komplexe Routinen und Regeln als deklarative SQL-Abfragen, Unterabfragen, Ansichten, Mehrbenutzerunterstützung, Transaktionen, Abfrageoptimierung, Vererbung und Arrays verarbeiten. Unterstützt nicht die Auswahl von Daten in verschiedenen Datenbanken.
MySQL MySQL verwendet SQL92 als Grundlage. Läuft auf unzähligen Plattformen. MySQL kann Abfragen erstellen, die Tabellen aus verschiedenen Datenbanken verknüpfen können. Unterstützt sowohl linke als auch rechte äußere Verknüpfungen mit ANSI- und ODBC-Syntax. Ab MySQL 4.1 verarbeitet MySQL Unterabfragen. Ab Version 5 unterstützte Ansichten.
Für eine detaillierte Beschreibung besuchen Sie bitte. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html
quelle