2011-06-23 20 views
9

Mam następujące klasy w moim modelu JPA (pobierające, ustawiaczy i pola nieistotne pominięta):JPA kompozytowa klucz podstawowy

@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; 
} 

muszę zdefiniować klasę Price tak, że gdy DDL is generated from the classes, podstawowym klucz odpowiedniej tabeli składa się z kluczy dla Product i Currency. Próbowałem następujące:

@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; 
} 

Ale to generuje następujące po PRICE tabeli:

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

Zauważ, że zarówno currency_id i product_id są pustych, co powoduje następujący błąd przy próbie załadowania DDL do SQL Server

nie można zdefiniować klucz podstawowy o wartości pustych kolumny w tabeli „cena”

Nie rozumiem, dlaczego są pustych, ponieważ w modelu domeny są one opatrzone @ManyToOne(optional = false)

DDL są generowane przy użyciu dialektu org.hibernate.dialect.SQLServerDialect SQL.

Odpowiedz

0

Ponieważ używasz @IdClass klasa PricePK nie musi być oznaczony @Embeddable adnotacji. Przykład jest podany w http://www.java2s.com/Code/Java/JPA/SetIdClassforCompoundKey.htm

Wypróbowałem twój kod usuwając @Embeddable na PricePK klasy i tabeli cen generowanych w bazie danych MySQL z niezerowymi polami.

obserwuję to w jaki sposób można wykorzystać @EmbeddedId do osiągnięcia pożądanego rezultatu: (pobierające i ustawiające pominięte)

@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

Próbowałem swoje sugestie, ale to nie robi żadnej różnicy –

+0

Chciałbyś spróbować użyć metoda '@ EmbeddedId'? –

+0

To też nie działa niestety –

Powiązane problemy