2016-01-28 3 views
0

У меня проблема с составным первичным ключом в спящем режиме.Hibernate. Generic Composite PK issue

Пример:

У меня есть класс, который представляет базовый первичный ключ для всех экземпляров этого.

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. 
} 

Все работает нормально, если у меня есть контракт с лицами, как это.

Но некоторые лица в моем проекте есть простой первичный ключ, как межды, длинные, String и т.д.

В этом случае я хотел бы иметь общий первичный ключ, как этот:

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" исключение.

ПФС Я использую Hibernate с Spring Framework для компонентов проводки.

Я бы благодарны за любую помощь!

ответ

0

Я думаю, что вы не можете использовать общий тип внутри класса ид. использовал @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

Я нашел решение: Теперь я использую '@ класса Embeddable' для представления моего примарного ключа«Generic»(который наследует первичный ключ базового класса) , и укажите его тип в объектах. Очень важно сохранить абстрактный класс «PrimaryKey» как базу для всех экземпляров первичного ключа. – Pasha190

Смежные вопросы