Protože id
pole je již jedinečné a automaticky se zvyšuje, v tomto případě nepotřebujete složené ID, takže vaše entita může vypadat takto:
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
Entitu lze načíst podle id pomocí správce entity:
entityManager.find(MyEntity.class, entityId);
nebo můžete entitu načíst pomocí dotazu, který přebírá obě id
a 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 má také SelectGenerator který dokáže načíst ID ze sloupce databáze, což je užitečné, když databáze generuje ID pomocí spouštěče.
Bohužel to nefunguje se složenými ID, takže jste si napsali svůj vlastní rozšířený SelectGenerator
nebo použijte jeden řetězec id_sub_id
sloupec, který kombinuje id a sub-id do jednoho sloupce VARCHAR:
'1-0'
'1-1'
'2-0'
'2-1'
Musíte napsat spouštěč databáze, abyste aktualizovali dva sloupce pomocí uložené procedury specifické pro databázi a agregovali dva sloupce do sloupce VARCHAR. Potom namapujete agregovaný sloupec pomocí standardního SelectGenerator
do pole Řetězec:
@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;
}