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;
}
}
Me da esta excepción:
Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass
¿Cuál es la mejor y más conveniente forma de generar los ID? No quiero cambiar mi estrategia de herencia.
hibernate
inheritance
jpa
class-table-inheritance
Martijn Pieters
fuente
fuente
Me pregunto si este es un problema específico del dialecto de la base de datos, ya que al ver un tutorial de YouTube con PostgreSQL como base de datos subyacente, vi que el creador del video ejecutó correctamente una aplicación con el valor predeterminado @GeneratedValue. En mi caso (la base de datos subyacente es MySQL) tuve que modificar la estrategia @GeneratedValue a GenerationType.TABLE exactamente como propone zoidbeck.
Aquí está el video: https://www.youtube.com/watch?v=qIdM4KQOtH8
fuente
GenerationType.SEQUENCE
. Por eso funciona automáticamente allí. No tiene absolutamente nada que ver con PostgreSQLINHERITS
.De acuerdo con la respuesta de Zoidbeck. Necesita cambiar de estrategia para:
Pero eso no es todo, necesita crear una nueva tabla, que contendrá la secuencia de clave primaria de la tabla de su resumen. Modifica tu mapeo para
Y una nueva tabla en la base de datos debería verse como sigue:
Cuando ejecutó su aplicación, Hibernate insertará una fila donde
sequence_name
estará el nombre de la entidad (SuperClass
en este ejemplo) y elsequence_next_hi_value
valor se incrementará automáticamente y se usará para los nuevos registros de todas las tablas de subclases de implementación.fuente
En nuestro caso, usamos una base de datos PostreSQL para desarrollo y producción y una base de datos hsqldb en memoria para pruebas. Estamos usando una secuencia en ambos casos para generar una identificación. Aparentemente
GenerationType.AUTO
defecto esSEQUENCE
para postgres, pero falló en nuestras pruebas locales (debe tomar otro valor predeterminado para hsqldb).Entonces, la solución que funcionó para nosotros, usar explícitamente
GenerationType.SEQUENCE
.fuente
puedes usar @MappedSuperclass para la herencia
fuente
Existe un cumplimiento estándar de SQL entre MySQL y PostgreSQL. PostgreSQL Postgres comprende un buen subconjunto de SQL92 / 99 más algunas características orientadas a objetos para estos subconjuntos. Postgres es capaz de manejar rutinas y reglas complejas como consultas SQL declarativas, subconsultas, vistas, soporte multiusuario, transacciones, optimización de consultas, herencia y matrices. No admite la selección de datos en diferentes bases de datos.
MySQL MySQL usa SQL92 como base. Funciona en innumerables plataformas. Mysql puede construir consultas que pueden unir tablas de diferentes bases de datos. Admite uniones externas tanto a la izquierda como a la derecha utilizando sintaxis ANSI y ODBC. A partir de MySQL 4.1 a partir de esa versión, MySQL manejará las subconsultas. Vistas admitidas a partir de la versión 5.
Para obtener una descripción detallada, visite. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html
fuente