2014-02-18 1 views
0

Как использовать IdClass в многократном наборе ключевых слов наследования?JPA Inheritence IdClass

@IdClass(IdClassEntity1.class) 
    class Entity1 { 
    private long e1pk1; 
    private long e1pk2; 
    } 
    @IdClass(IdClassEntity2.class) 
    class Entity2 extends Entity1 { 
    private long e2pk1; 
    private long e2pk2; 
    } 
    class Entity3 extends Entity2 { 
    private long e3pk1; 
    private long e3pk2; 
    } 

, что должно быть IdClassEntity2:

class IdClassEntity2 { 
     private long e1pk1; 
     private long e1pk2; 
     private long e2pk1; 
     private long e2pk2; 
} 

или

class IdClassEntity2 { 
     private IdClassEntity1 idClassEntity1; 
     private long e2pk1; 
     private long e2pk2; 
} 
+0

Они отображаются по умолчанию, просто добавьте MappedSuperClass или @Entity, не нужно пересмотреть в подклассах. – Koitoer

+0

вопрос обновлен – hiddenuser

ответ

1

Вы можете использовать @MappedSuperClass или @Entity объявить @IdClass. Pk распространяется через наследование.

Например, с помощью @MappedSuperClass, вы можете сделать следующее:

@MappedSuperClass 
@IdClass(IdClassEntity1.class) 
public class Entity1 { 
    @Id private long e1pk;  
    @Id private long e1pk; 
    ... 

@Entity 
public class Entity2 extends Entity1 { 
    ... 

Использование @Entity, следовать той же парадигме

+0

Итак, иерархия подкласса не может определить собственный Pk с Super PK: Super (PK1, PK2), SubClass1 (PK3) и SubClass2 (PK4) – hiddenuser

+2

@hiddenuser: Нет, они не могут определить свой ПК. Все классы сущностей в иерархии используют один и тот же составной ключ из объекта '@ MappedSuperclass', чтобы вы могли называть' em.find() 'на них. С точки зрения базы данных все экземпляры сущности из иерархии хранятся в одной таблице, и каждый тип сущности распознается дискриминатором. Примите во внимание, что вы не можете создавать экземпляр и запрашивать 'Entity1', поскольку он не является постоянным. – wypieprz