2011-06-23 14 views
9

He las siguientes clases en mi modelo de APP (getters, setters, y campos irrelevantes omitidas):APP primario compuesto clave

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Currency { 

    @Id 
    private Integer ix; 
} 

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Product { 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
} 

tengo que definir una clase Price, de tal manera que cuando el DDL is generated from the classes, la primaria la clave de la tabla correspondiente se compone de las claves para Product y Currency. He intentado lo siguiente:

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@IdClass(PricePK.class) 
public class Price { 

    @Id @ManyToOne(optional = false) 
    private Product product; 

    @Id 
    @ManyToOne(optional = false) 
    private Currency currency; 
} 

@Embeddable 
public class PricePK implements Serializable { 

    Integer product;   
    Integer currency; 
} 

Pero esto genera los siguientes para la tabla PRICE:

create table PRICE (
    currency_id int null, 
    product_id int null, 
    primary key (currency_id, product_id) 
); 

en cuenta que tanto currency_id y product_id son anulable, lo que provoca el siguiente error cuando intento cargar el DDL en SQL Server

no se puede definir la restricción PRIMARY KEY en la columna anulable en la tabla 'precio'

No entiendo por qué son anulable, ya que en el modelo de dominio que se anotan @ManyToOne(optional = false)

El DDL se genera utilizando el dialecto SQL org.hibernate.dialect.SQLServerDialect.

Respuesta

0

dado que está utilizando @IdClass, la clase PricePK no tiene que estar marcado con el @Embeddable anotación. Un ejemplo se da en http://www.java2s.com/Code/Java/JPA/SetIdClassforCompoundKey.htm

Probé su código eliminando el @Embeddable en la clase , y la tabla de precios generada en la base de datos MYSQL con campos no nulos.

A continuación se presenta cómo se puede utilizar @EmbeddedId para lograr el resultado deseado: (captadores y definidores omitido)

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Price { 

    @EmbeddedId 
    PricePK pricePk; 
} 

@Embeddable 
public class PricePK implements Serializable { 

    @ManyToOne(optional = false) 
    private Product product; 

    @ManyToOne(optional = false) 
    private Currency currency; 
} 
+0

Probé su sugerencia, pero no hace ninguna diferencia –

+0

¿Le gustaría probar usando el método '@ EmbeddedId'? –

+0

Desafortunadamente no funcionó –