2009-06-23 4 views
9

Mam hierarchię klas:Co jest właściwe odwzorowanie JPA dla @Id w rodzica i unikalnej sekwencji w klasach bazowych

abstract DomainObject { 
... 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ") 
    @SequenceGenerator(name="SEQ",sequenceName="SEQ_DB_NAME") 
    @Column(name = "id", updatable = false, nullable = false) 
    private Long id; 
... 
} 

BaseClass extends DomainObject { 
... 
    // Fill in blank here where this class's @Id will use a unique sequence generator 
    // bonus points for any sort of automatic assignment of generator names that might 
    //prevent me from having to instrument all my domain objects uniquely 
... 
} 

Uwagi:

  • Nie trzeba specjalnie generator klasy bazowej , więc jeśli to mnie zobowiązuje, aby go usunąć, nie ma problemu.
  • To db Oracle 9i jeśli to ma zastosowanie
  • Hibernate 3.4 JPA
  • Wiosna 2.5 jest dostępny również

Dzięki

Odpowiedz

8

Ok oto jak skończyło się na rozwiązywaniu problemu:

Klasa bazowa:

@MappedSuperclass 
public abstract class DomainObject implements Serializable { 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ") 
@Column(name = "id", updatable = false, nullable = false) 
private Long id; 

.. rest of class 
} 

klasa potomek:

@Entity 
@SequenceGenerator(name="SEQ",sequenceName="SEQ_DB_NAME") 
public class BusinessObject extends DomainObject { 

... 

} 
+1

Wierzę, że to działałoby tylko dla twojego pierwszego rozszerzenia DomainObject w tej samej jednostce trwałości. Na następnym, gdzie musisz ustawić nazwę SequenceGenerator na "SEQ", to nie. Przynajmniej to, co robiłem za pomocą EclipseLink JPA provider, i zgodnie z javadoc http://download.oracle.com/javaee/5/api/javax/persistence/SequenceGenerator.html nazwa musi być unikalna. – digitaljoel

+1

dla każdego, kto ogląda ten wątek ... ten komentarz dotyczy OpenJPA 2.2. Nie można przeciążać nazwy SequenceGenerator. – DAJ

0

Polecam użyć dołączył typ dziedziczenia dla klasa podstawowa. Spowoduje to umieszczenie wszystkich wspólnych pól w tabeli podstawowej i dostosowań w określonych tabelach. Oto adnotacji na to:

@Inheritance(strategy=InheritanceType.JOINED) 

Gdy to zrobisz, możesz użyć dowolnego dość dużo opcji sekwencjonowania jak wszystkie identyfikatory są zawsze na tym samym stole. Możesz użyć oddzielnej sekwencji, jeśli chcesz, ale nie jest ona obsługiwana przez wszystkich dostawców baz danych. Myślę, że to nie jest problem, ponieważ używasz konkretnie Oracle.

Użyłem tego i wygląda na to, że działa dobrze.

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 
+0

To trochę trudno powiedzieć, co było intencją Nathan z przykładu, ale natknąłem się na to pytanie, ponieważ migruję z mapowania Hibernate do adnotacji JPA i wszystkich moich rozszerzenie klasy bazowej, więc nie muszę definiować pola id, getter/setter, equals(), hashCode() itp. dla każdej klasy, którą chcę utrzymywać. W moim przypadku używam dziedziczenia w celu zmniejszenia kodu standardowego, ale tak naprawdę nie dzieje się tak z perspektywy danych. W takim przypadku preferowanym rozwiązaniem byłaby klasa @MappedSuperclass. – spaaarky21

Powiązane problemy