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.