hibernate - strategy - No se puede usar la generación de claves de columna de identidad con<union-subclass>(TABLE_PER_CLASS)
jpa inheritance (6)
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 manera para que yo genere los ID? No quiero cambiar mi estrategia de herencia.
De acuerdo con la respuesta de zoidbeck Debes cambiar la estrategia a:
@GeneratedValue(strategy = GenerationType.TABLE)
Pero eso no es todo, necesita crear una nueva tabla, lo que mantendrá la secuencia de teclas principales de la tabla de su resumen. Modifique su mapeo a
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator")
@TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator")
public long getConfirmationCode() {
return confirmationCode;
}
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
será el nombre de la entidad ( SuperClass
en este ejemplo) y el valor sequence_next_hi_value
se incrementará automáticamente y se usará para nuevos registros de todas las tablas de subclases implementadas.
El problema aquí es que mezcla la herencia de "tabla por clase" y GenerationType.Auto
. Considere una columna de identidad en MsSQL. Está basado en columnas. En una estrategia de "tabla por clase", utiliza una tabla por clase y cada una tiene una ID.
Tratar:
@GeneratedValue(strategy = GenerationType.TABLE)
En nuestro caso, utilizamos una base de datos PostreSQL para desarrollo y producción y una base de datos hsqldb en memoria para las pruebas. Estamos usando una secuencia en ambos casos para generar una identificación. Aparentemente GenerationType.AUTO
predeterminada en SEQUENCE
para postgres, pero falla en nuestras pruebas locales (debe establecerse de forma predeterminada en otra cosa para hsqldb).
Entonces, la solución que funcionó para nosotros, usa explícitamente GenerationType.SEQUENCE
.
Me pregunto si esto es un problema específico del dialecto de la base de datos, ya que viendo un tutorial de youtube con PostgreSQL como la base de datos subyacente vi que el creador del video ejecutó con éxito una aplicación con @GeneratedValue predeterminado. En mi caso (la base de datos subyacente es MySQL) tuve que modificar la estrategia @GeneratedValue a GenerationType.TABLE exactamente como lo propone zoidbeck.
Aquí está el video: https://www.youtube.com/watch?v=qIdM4KQOtH8
puedes usar @MappedSuperclass para herencia
Existe un estándar SQL de cumplimiento entre MySQL y PostgreSQL. PostgreSQL Postgres entiende 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 declarativas de SQL, 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 su base. Se ejecuta en innumerables plataformas. Mysql puede construir consultas que pueden unir tablas de diferentes bases de datos. Admite combinaciones externas izquierda y derecha usando sintaxis ANSI y ODBC. A partir de MySQL 4.1 desde esa versión, MySQL manejará las subconsultas. Vistas admitidas a partir de la versión 5.
Para una descripción detallada, visite. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html