2016-01-28 89 views
0

我在Hibernate中遇到了複合主鍵問題。休眠。通用複合PK問題

實施例:

我有代表的這樣的所有實例基地主鍵的類。

public abstract class PrimaryKey implements Serializable { /* ... */ } 

它只是實現java.io.Serializable接口,並且可以在仿製藥或其他類的方法作爲參數一起使用,以縮小公認的班。

另一個主鍵類應繼承它並將您的特定字段添加爲鍵。例如:

public class PassportPK extends PrimaryKey { 

    private String number; 
    private String series; 

    public PassportPK() {} 

    public PassportPK(String number, String series) { 
     this.number = number; 
     this.series = series; 
    } 

    // Getters/setters are below. 
} 

那麼它在適當的實體像這樣使用:

@Entity 
@Table(name = "T_PASSPORTS") 
@IdClass(PassportPK.class) 
public class Passport implements Serializable { 

    @Id 
    @Column(name = "F_NUMBER") 
    private String number; 
    @Id 
    @Column(name = "F_SERIES") 
    private String series; 

    public Passport() {} 

    // Getters/setters are below. 
} 

一切工作正常,如果我有這樣的實體交易。

但在我的項目的一些實體有這樣的int,long,串一個簡單的主鍵,等

在這種情況下,我想有這樣一個通用的主鍵:

public class SimplePK<T extends Serializable> extends PrimaryKey { 

    /** 
    * Represents a simple key field of entity (i.e. int, long, String, ...); 
    */ 
    private T id; 

    public SimplePK() {} 

    public SimplePK(T id) { 
     this.id = id; 
    } 

    public T getId() { 
     return this.id; 
    } 

    public void setId(T id) { 
     this.id = id; 
    } 
} 

問題:如何在註解映射中解決它?

p.s.當我試圖解決它像前面的例子(通過@IdClass(SimplePK.class中)我趕上"org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [application-context.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Property com.testprj.entity.SimplePK.id has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type"例外。

PPS我用配線組件Spring框架Hibernate的。

我會感謝任何幫助!

回答

0

我認爲你不能在id類中使用泛型類型 如果你只想使用一個屬性,使用@IdClass表示複合主鍵的類像主鍵你必須在聲明中使用@Id並刪除@IdClass。

實施例:

@Entity 
@Table(name = "T_PASSPORTS") 
public class Passport implements Serializable { 

    @Id 
    private String id; //Or int, long... 

    public Passport() {} 

    // Getters/setters are below. 

}

+1

我找到了解決方案:現在,我使用'@我的「通用」 -primary鍵的表示Embeddable'類(繼承主鍵基類) ,並在實體中指定其類型。將抽象的「PrimaryKey」類保存爲所有主鍵實例的基礎非常重要。 – Pasha190