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?
Odpowiedzi:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
i zostawiasz to null
( 0
), gdy trwa. ( null
jeśli używasz Integer
/ Long
wrappers)
W niektórych przypadkach AUTO
strategia jest rozwiązywana jako SEQUENCE
rathen niż IDENTITY
lub TABLE
, więc możesz chcieć ręcznie ustawić ją na IDENTITY
lub TABLE
(w zależności od bazowej bazy danych).
Wygląda na to, że SEQUENCE
+ określenie nazwy sekwencji zadziałało dla ciebie.
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 (?, ?, ?, ?, ?)
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!
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 .
Jeśli masz kolumnę numeryczną, którą chcesz automatycznie zwiększać, możesz ustawić ją columnDefinition
bezpoś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
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
}
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