2010-06-18 15 views
18

Jestem usign @GeneratedValue (strategy = GenerationType.AUTO), aby wygenerować identyfikator w mojej jednostce.Sekwencja hibernacji na oracle, @GeneratedValue (strategia = GenerationType.AUTO)

Nie wiem jak to działa, ale na mojej tabeli podrzędnej generuje wartości identyfikacyjne, które są zgodne z sekwencją nadrzędną.

//parent table 
@Entity 
@Table (name = "parent") 
public class Parent { 

    @Id 
    @GeneratedValue (strategy = GenerationType.AUTO) 
    @Column (name = "id") 
    private long id; 


    @OneToMany (cascade = {CascadeType.ALL}, fetch = FetchType.LAZY) 
    @JoinColumn (name = "parentId") 
    @ForeignKey (name = "FKparent") 
    private List<child> child; 

} 

//child table 
@Entity 
@Table (name = "child") 
public class Child { 

    @Id 
    @GeneratedValue (strategy = GenerationType.AUTO) 
    @Column (name = "id") 
    private long id; 
} 

Wprowadzone wartości identyfikacyjne na rodzica, aktualizuje sekwencję. Wprowadzone wartości identyfikacyjne na elemencie podrzędnym, aktualizuje sekwencję. Przy następnej wstawce nadrzędnej sekwencja ... używa wartości zaktualizowanych przez wstawienia podrzędne ...

Te adnotacje nie tworzą dwóch sekwencji, tylko jedną. Czy to jest poprawne/oczekiwane?

I dodaje moje podmioty z moją służbą DAO tylko przy użyciu entityManager.persist(parent);

Odpowiedz

1

Tak to prawda i oczekiwane.

Możesz tworzyć pojedyncze sekwencje dla każdej tabeli, ale IMHO to tylko dodatkowy kod bez rzeczywistej korzyści.

+0

Nie, jeśli użytkownik końcowy widzi, że klucze i zostaje wprowadzony w błąd przez to bycie " nerwowy". I nie mów mi, że klucz musi być ukryty przed użytkownikiem, co nie zawsze jest możliwe ... – Monoman

+1

Nie ma sposobu na utrzymanie identyfikatorów w czasie i monotonii bez dziur w sekwencji, która nie zabija skalowalność. Nie widziałem też użytecznej definicji "skoku" i tego, dlaczego użytkownicy potrzebują niezmiennych identyfikatorów. –

44

Te adnotacje nie tworzą dwóch sekwencji, tylko jedną. Czy to jest poprawne/oczekiwane?

To oczekiwane zachowanie. Podczas korzystania z usługi @GeneratedValue(strategy = GenerationType.AUTO) dostawca JPA wybierze odpowiednią strategię dla konkretnej bazy danych. W przypadku Oracle będzie to SEKWENCJA, a ponieważ nic nie podano, Hibernate użyje pojedynczej globalnej sekwencji o nazwie hibernate_sequence.

Czy to prawda? Cóż, nie wiem, zależy to od twoich potrzeb. Na wszelki wypadek domyślną maksymalną wartością dla sekwencji Oracle jest 1E + 27 lub 1 000 000 000 000 000 000 000 000 000. To wystarcza dla wielu.

Teraz możliwe jest użycie GenerationType.AUTO i nadal kontrolować nazwę sekwencji, gdy baza danych wykorzystuje sekwencje:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen") 
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ") 
private Long id; 
+4

Pascal, ale jeśli chcesz użyć GenerationType.AUTO, aby umożliwić innym bazom danych, takim jak MySQL, używanie Insert tożsamości, to nie zadziała, prawda? Ponieważ ręcznie określasz generator – lujop

0
@Entity 
@Table(name = "table_seq") 
@SequenceGenerator(name= "NAME_SEQUENCE", sequenceName = "SEQ_ID", initialValue=1, allocationSize = 1) 
public class SeqEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NAME_SEQUENCE") 
private Long id; 

} 
Powiązane problemy