Dal momento che l'id
il campo è già univoco e incrementato automaticamente, in questo caso non è necessario un ID composito, quindi la tua entità può assomigliare a questa:
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
L'entità può essere recuperata tramite ID utilizzando il gestore entità:
entityManager.find(MyEntity.class, entityId);
oppure potresti recuperare l'entità utilizzando una query che accetta entrambi gli id
e il 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 ha anche un SelectGenerator che può recuperare l'id da una colonna del database, utile quando il database genera l'id utilizzando un trigger.
Sfortunatamente, non funziona con gli ID compositi, quindi appassisci hai scritto il tuo SelectGenerator
esteso oppure usa una singola stringa id_sub_id
colonna che combina id e sub-id in un'unica colonna VARCHAR:
'1-0'
'1-1'
'2-0'
'2-1'
È necessario scrivere un trigger di database per aggiornare le due colonne utilizzando una stored procedure specifica del database e aggregare le due colonne in quella VARCHAR. Quindi mappa la colonna aggregata utilizzando il SelectGenerator
standard in un campo Stringa:
@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;
}