Ponieważ id
pole jest już unikalne i automatycznie zwiększane, w tym przypadku nie potrzebujesz złożonego identyfikatora, aby Twoja jednostka mogła wyglądać tak:
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
Encję można pobrać za pomocą identyfikatora za pomocą menedżera encji:
entityManager.find(MyEntity.class, entityId);
lub możesz pobrać encję za pomocą zapytania, które pobiera oba id
i subid
:
MyEntity myEntity = entityManager.createTypeQuery("select me from MyEntity where id = :id and subid = :subid", MyEntity.class)
.setParameter("id", entityId)
.setParameter("subid", entitySubId)
.getSingleResult();
Hibernate ma również SelectGenerator które mogą pobrać identyfikator z kolumny bazy danych, co jest przydatne, gdy baza danych generuje identyfikator za pomocą wyzwalacza.
Niestety nie działa ze złożonymi identyfikatorami, więc napisałeś swój własny rozszerzony SelectGenerator
lub użyj pojedynczego ciągu id_sub_id
kolumna, która łączy id i sub-id w jedną kolumnę VARCHAR:
'1-0'
'1-1'
'2-0'
'2-1'
Musisz napisać wyzwalacz bazy danych, aby zaktualizować dwie kolumny przy użyciu procedury składowanej specyficznej dla bazy danych i zagregować dwie kolumny w jedną VARCHAR. Następnie mapujesz zagregowaną kolumnę za pomocą standardowego SelectGenerator
do pola tekstowego:
@Id
@Column(name = "id_sub_id")
@GeneratedValue( strategy = "trigger" )
@GenericGenerator(
name="trigger", strategy="org.hibernate.id.SelectGenerator",
parameters = {
@Parameter( name="keys", value="id_sub_id" )
}
)
public String getId() {
return id;
}