Sedan id
fältet är redan unikt och automatiskt inkrementerat, du behöver inte ett sammansatt id i det här fallet så din enhet kan se ut så här:
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
Entiteten kan hämtas med id med hjälp av entitetshanteraren:
entityManager.find(MyEntity.class, entityId);
eller så kan du hämta entiteten med en fråga som tar både id
och 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 har också en SelectGenerator som kan hämta id:t från en databaskolumn, vilket är användbart när databasen genererar id:t med en trigger.
Tyvärr fungerar det inte med sammansatta ID, så du vissna skrev din egen utökade SelectGenerator
eller använd en enda sträng id_sub_id
kolumn som kombinerar id och sub-id till en enda VARCHAR kolumn:
'1-0'
'1-1'
'2-0'
'2-1'
Du måste skriva en databasutlösare för att uppdatera de två kolumnerna med hjälp av en databasspecifik lagrad procedur och aggregera de två kolumnerna till VARCHAR-en. Du mappar sedan den aggregerade kolumnen med standard SelectGenerator
till ett strängfält:
@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;
}