claves compuestas jpa+hibernate con GeneratedValue, ¿no es posible?

1,207 views
Skip to first unread message

David Martin

unread,
Dec 10, 2013, 7:49:59 AM12/10/13
to barcel...@googlegroups.com
Hola!

Hoy se me ha caído un mito como hibernate + JPA :(

Por lo visto no permiten claves compuestas en las que uno de los campos es autoincremental (Identity o secuencias), algo que si que funciona en claves simples con la anotación @GeneratedValue. Esto es lo que he encontrado:

The GeneratedValue annotation may be applied to a primary key property or field of an entity or mapped superclass in conjunction with the Id annotation. The use of the GeneratedValue annotation is only required to be supported for simple primary keys. Use of the GeneratedValue annotation is not supported for derived primary keys.

http://docs.oracle.com/javaee/6/api/javax/persistence/GeneratedValue.html

Pongamos un ejemplo:

Tenemos una tabla Employee con un id autoincremental (por cierto, utilizamos SQL Server)

@Entity
public class Employee implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "EmployeeID")
    private Integer employeeID;
    
    @Column(name = "Name")
    private String name;

   // todo el resto
}

La anotación @GeneratedValue funciona sin problemas...simplemente cuando ejecuta la query de insert no la incluye. Ahora tenemos un detalle de la tabla para las direcciones.

@Entity
public class EmployeeAddress implements Serializable {

    @EmbeddedId
    protected EmployeeAddressPK employeeAddressPK;
    
    @Column(name = "Address")
    private String address;

   // todo el resto
}

La PK compuesta se pone en otra tabla

@Embeddable
public class EmployeeAddressPK implements Serializable {

    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "AddressID")    
    private int addressID;

    @Column(name = "EmployeeID")
    private int employeeID;

   // todo el resto
}

Si ejecutamos esto, sí que pasa el campo AddressID por lo que SQL devuelve un error:

11:54:01,928  WARN JDBCExceptionReporter:77 - SQL Error: 544, SQLState: S0001
11:54:01,936 ERROR JDBCExceptionReporter:78 - No se puede insertar un valor explícito en la columna de identidad de la tabla 'EmployeeAddress ' cuando IDENTITY_INSERT es OFF.

¿es posible que no se pueda implementar con JPA y Hibernate este diseño de Base de Datos? 

La BD AdventureWorks de Microsoft tiene varias tablas con este tipo de relación por lo que entiendo que no será tan 'raro'.

¿como resolvéis estos casos?

Saludos.


Nacho Cougil Jares

unread,
Jan 7, 2014, 12:49:20 PM1/7/14
to barcel...@googlegroups.com
Hola David,

La verdad que no me he encontrado con esta casuística, pero la verdad no parece un tema tan complejo como para no haber encontrado una solución habitual, ¿no? Es decir, la creación de campos con autoincrementales sí que es algo habitual, pero no sé si tanto es así para claves compuestas (cuesta de creer que la spec diga directamente que no se soporta...). ¿Nadie lo ha comentado o se ha encontrado un problema similar por ahí? 

So sorry,... 

Salu2,

Robert Ramírez Vique

unread,
Jan 7, 2014, 1:17:36 PM1/7/14
to barcel...@googlegroups.com
Hola,

la verdad es que no estoy nada puesto en Hibernate y JPA pero mirando un poquito tal vez la solución pasa por usar la anotación @IdClass (+@Id) o @EmbeddedId (+@Embeddable)

Algunas referencias:

saludos, robert


       Robert Ramírez Vique
       Computer Science Engineer


2014/1/7 Nacho Cougil Jares <ignacio...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "Barcelona JUG" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a barcelona-ju...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

David Villacampa

unread,
Jan 8, 2014, 1:29:18 PM1/8/14
to barcel...@googlegroups.com
Hola,

Yo no usaria clave compuesta al final tendras problemas, usa una clave primaria y anotaciones ManyToOne para las relaciones entre entities.

Espero te sirva,

David





Salutacions / Best regards,
David Villacampa



-------- Missatge original --------
De: Nacho Cougil Jares <ignacio...@gmail.com>
Data: 07/01/2014 18:49 (GMT+01:00)
A: barcel...@googlegroups.com
Assumpte: { Barcelona JUG } Re: claves compuestas jpa+hibernate con GeneratedValue, ¿no es posible?
Reply all
Reply to author
Forward
0 new messages