Identyfikator automatycznego przyrostu hibernacji

86

Mam aplikację j2ee używającą hibernacji z adnotacjami. Jak dodać adnotację do pola Id w mojej klasie pojo, aby ustawić je jako automatycznie zwiększane lub generowane automatycznie. i dodając fasolę, czy pozostawiam to pole w mojej fasoli zero?

cedric
źródło

Odpowiedzi:

161
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

i zostawiasz to null( 0), gdy trwa. ( nulljeśli używasz Integer/ Longwrappers)

W niektórych przypadkach AUTOstrategia jest rozwiązywana jako SEQUENCErathen niż IDENTITYlub TABLE, więc możesz chcieć ręcznie ustawić ją na IDENTITYlub TABLE(w zależności od bazowej bazy danych).

Wygląda na to, że SEQUENCE+ określenie nazwy sekwencji zadziałało dla ciebie.

Bozho
źródło
mój identyfikator jest typu string. co mam na to ustawić. Ponieważ otrzymuję ten błąd. Przyczyna: javax.el.ELException: org.hibernate.exception.SQLGrammarException: nie można pobrać następnej wartości sekwencji
cedric
4
autoincrement oznacza, że ​​jest to liczba, która jest zwiększana. Ciąg nie może być zwiększany. Ustaw kolumnę na int
Bozho
Kolumna myid w bazie danych jest typu numer. I już zmieniłem swój identyfikator w moim pojo na int. Dostaję, że sekwencja błędów nie istnieje
cedric
2
W przypadku Oracle SEQUENCE jest czymś najbliższym autoinkrementacji. Musisz utworzyć sekwencję z wyprzedzeniem, chyba że pozwolisz Hibernacji na wygenerowanie schematu. Jeśli uważasz, że w pewnym momencie możesz obsługiwać wiele baz danych, użyj tabeli TABLE.
Brian Deterling
2
Nie używaj tożsamości, Oracle nie obsługuje tożsamości, obsługuje sekwencję.
JuanZe,
33

Zrób to w następujący sposób: -

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

Zamiast kaugen możesz użyć dowolnej nazwy. Działało dobrze, mogłem zobaczyć poniżej zapytania na konsoli

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
Kaushik Lele
źródło
Ten działa dla mnie. Ale nie pozwala mi ustawić wartości identyfikatora. Próbowałem ustawić ID z liczbami całkowitymi lub int, ale zawsze używa max. Co powinienem zrobić?
desudesudesu
użyj @GenericGenerator (name = "inkrementId", strategia = "przypisane") @GeneratedValue (generator = "IncrementId"). Pozwoli ci to ustawić własny identyfikator. Jeśli jednak nie przekażesz id, będzie to 0.
Ravi Kant
@Kaushik Lele Czy strategia = "zwiększanie" hibernacji wbudowanego przyrostu jest strategiczna? Czy to podlega której z tych SEKWENCJI, TOŻSAMOŚCI, AUTO, TABELA?
czuć się dobrze i programować
A co z 700 milionami rekordów w tabeli? Myślę, że to może być problem bez indeksu
user2171669
10

FYI

Użycie netbeans New Entity Classes from Database z kolumną mysql * auto_increment * tworzy atrybut z następującymi adnotacjami:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

To powodowało ten sam błąd, który mówił, że kolumna nie może być pusta, więc po prostu usunąłem anotację @NotNull, pozostawiając atrybut null i działa!

jmoreira
źródło
7

Hibernate definiuje pięć typów strategii generowania identyfikatorów:

AUTO - albo kolumna, sekwencja lub tabela tożsamości, w zależności od bazowej bazy danych

TABELA - tabela zawierająca identyfikator

TOŻSAMOŚĆ - kolumna tożsamości

SEQUENCE - sekwencja

kopia tożsamości - tożsamość jest kopiowana z innego podmiotu

Przykład użycia Table

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

aby uzyskać więcej informacji, sprawdź link .

user2530633
źródło
4

Jeśli masz kolumnę numeryczną, którą chcesz automatycznie zwiększać, możesz ustawić ją columnDefinitionbezpośrednio. Ma to tę zaletę, że schemat automatycznie generuje wartość, nawet jeśli jest używany bez hibernacji. Może to jednak sprawić, że twój kod będzie specyficzny dla bazy danych:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
alfonx
źródło
MySQL to @Column (columnDefinition = "integer auto_increment")
yeralin
1

Na wypadek, gdyby ktoś „wpadł” w to pytanie SO w poszukiwaniu strategii dla tabeli Informix, gdy PK jest typu Serial .

Odkryłem, że to działa ... jako przykład.

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

Aby to zadziałało, upewnij się, że wykonujesz sesję.SaveOrUpdate podajesz wartość w kolumnie special_serial_pk NULL .

W moim przypadku robię HTML POST z JSON tak ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}
Henrique C.
źródło
0

Używając netbeans New Entity Classes from Database z kolumną mysql auto_increment , tworzymy atrybut z następującym hibernate.hbm.xml: id is auto inkrement

Ankur Patel
źródło