com.algo.Superclase:

@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.algo.Subclase:

@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 mí para generar el IDENTIFICADOR? No quiero cambiar mi herencia estrategia.

InformationsquelleAutor | 2009-05-27

6 Comentarios

  1. 207

    El problema aquí es que usted mix «de tabla por clase de» herencia y GenerationType.Auto.
    Considere la posibilidad de una columna de identidad en MsSQL. Es la columna base. En una «tabla por clase de» estrategia de utilizar una tabla por cada clase y cada uno tiene un IDENTIFICADOR.

    Tratar:

    @GeneratedValue(strategy = GenerationType.TABLE)

    • La Solución Perfecta. Incluso Hibernate foros didnot parecen tener solución, y que iban en torno al tema forum.hibernate.org/…
    • Es este problema es con MySql sólo o su regulares como puedo ver uno de un vídeo para la Tabla por clase de enfoque y estaba trabajando bien en que postgres se utilizó
    • Me encontré con esto recientemente cuando se prueba una Dropwizard aplicación. En mi caso me dirigí al asegurarse de usar las mismas opciones de configuración utilizado por DW para crear la sesión de fábrica. Estoy bastante seguro de que la configuración de la propiedad «hibernate.id.new_generator_mappings» a la verdadera es lo que fija. Este es DW 0.7.0, Hibernate 4.3.1, DB H2.
    • Funciona a la perfección. Sin embargo, no se recomienda preferir el uso de ‘TABLA’ id estrategia de generación, ya que desencadena un montón de consultas (select, insert y update) y mantiene los bloqueos para generar valores únicos de la clave primaria. Entonces, ¿cuál sería una solución alternativa a este Si hay algo una gran Herencia escenario? Sin duda, va a influir en el rendimiento en gran medida.
  2. 8

    Me pregunto si esta es una base de datos dialecto problema específico, ya que viendo en youtube un tutorial con PostgreSQL como base de datos subyacente vi que el creador del video ejecutar succefully una aplicación con el valor de @GeneratedValue. En mi caso (el subyacente de la base de datos es MySQL), he tenido que modificar el @GeneratedValue estrategia para GenerationType.TABLA exactamente como zoidbeck propone.

    Aquí está el video : https://www.youtube.com/watch?v=qIdM4KQOtH8

    • Postgres es capaz de hacer de la herencia por lo que podría ser cierto que esta es específico de base de datos: postgresql.org/docs/8.1/static/ddl-inherit.html El video no explica (o se me perdió) cómo el esquema se genera. Así que tal vez la NHibernate postgres dialecto es capaz de hacerlo por su propia cuenta o la de que en lugar de tener que añadir el ‘HEREDA’ manualmente. En realidad no puedo decir.
    • En PostgreSQL, Hibernate valores predeterminados para utilizar GenerationType.SEQUENCE. Es por eso que funciona automáticamente. No tiene absolutamente nada que ver con PostgreSQLs INHERITS.
    • he estado usando el mismo tutorial & uso de @Generado estaba causando el problema como yo lo estoy usando MySql.Pasamos un montón de tiempo de depuración hasta que vi este post
  3. 2

    En nuestro caso, utilizamos una Postgresql base de datos para dev, y la producción y en la memoria de la base de datos hsqldb para las pruebas. Estamos utilizando una secuencia en ambos casos para generar un identificador. Al parecer GenerationType.AUTO valores predeterminados para SEQUENCE para postgres, pero no en nuestro local de ensayos (debe predeterminado para algo más para hsqldb).

    Por lo que la solución que funcionó para nosotros, de forma explícita el uso de GenerationType.SEQUENCE.

  4. 2

    De acuerdo con zoidbeck la respuesta.
    Usted necesita para cambiar de estrategia:

    @GeneratedValue(strategy = GenerationType.TABLE)

    Pero eso no es todo, usted necesita para crear una nueva tabla, lo que contendrá el resumen de la tabla de la clave primaria de la secuencia. Modificar la asignación de

    @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 debe verse como la siguiente:
    Puede utilizar la identidad de la columna de generación de claves con <unión-subclase> ( TABLE_PER_CLASS )

    Cuando corrió su aplicación, Hibernate insertar una fila donde sequence_name será el nombre de la entidad (SuperClass en este ejemplo) y sequence_next_hi_value valor se incrementará automáticamente y se utiliza para los nuevos registros de todas la implementación de las subclases de las tablas.

  5. 1

    puede utilizar @MappedSuperclass para la herencia

    • puede agregar código de ejemplo para su respuesta?
  6. 0

    Hay un SQL Cumplimiento de la norma en entre MySQL y PostgreSQL.
    PostgreSQL
    Postgres entiende una buena subconjunto de SQL92/99, además de algunas características orientadas a objetos para estos subconjuntos. Postgres es capaz de manejar complejas rutinas y normas declarativas de consultas SQL, subconsultas, vistas, multi-soporte al usuario, transacciones, optimización de consultas, la herencia, y las matrices. No admite la selección de datos a través de diferentes bases de datos.

    MySQL
    MySQL utiliza el SQL92 como su fundación. Se ejecuta en un sinnúmero de plataformas. Mysql puede construir consultas que se pueden unir tablas de diferentes bases de datos. Soporta tanto la izquierda y la derecha combinaciones externas utilizando ANSI y de la sintaxis ODBC. A partir de MySQL 4.1 de que la puesta en, MySQL manejar las subconsultas. Vistas apoyado en la versión 5.

    Para obtener una descripción detallada, por favor visite.
    http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html

    • Por favor, no te sientas mal por esto, pero creo que MySQL y PostgreSQL comparación es irrelevante para el tema (aunque Hibernate valores predeterminados son diferentes para ellos).

Dejar respuesta

Please enter your comment!
Please enter your name here