Sinds de id
veld is al uniek en wordt automatisch verhoogd, u heeft in dit geval geen samengestelde id nodig, zodat uw entiteit er als volgt uit kan zien:
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
De entiteit kan worden opgehaald op id met behulp van de entiteitsmanager:
entityManager.find(MyEntity.class, entityId);
of je zou de entiteit kunnen ophalen met behulp van een query die zowel de id
en de 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 heeft ook een SelectGenerator die de id uit een databasekolom kan halen, wat handig is wanneer de database de id genereert met behulp van een trigger.
Helaas werkt het niet met samengestelde id's, dus je schreef je eigen uitgebreide SelectGenerator
of gebruik een enkele string id_sub_id
kolom die de id en sub-id combineert in een enkele VARCHAR-kolom:
'1-0'
'1-1'
'2-0'
'2-1'
U moet een databasetrigger schrijven om de twee kolommen bij te werken met behulp van een databasespecifieke opgeslagen procedure en de twee kolommen samenvoegen tot de VARCHAR-kolom. Vervolgens brengt u de geaggregeerde kolom in kaart met behulp van de standaard SelectGenerator
naar een String-veld:
@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;
}