Depuis le id
est déjà unique et incrémenté automatiquement, vous n'avez pas besoin d'un identifiant composite dans ce cas, votre entité peut donc ressembler à ceci :
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
L'entité peut être récupérée par identifiant à l'aide du gestionnaire d'entité :
entityManager.find(MyEntity.class, entityId);
ou vous pouvez récupérer l'entité en utilisant une requête qui prend à la fois le id
et le 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 a également un SelectGenerator qui peut récupérer l'identifiant à partir d'une colonne de base de données, ce qui est utile lorsque la base de données génère l'identifiant à l'aide d'un déclencheur.
Malheureusement, cela ne fonctionne pas avec les identifiants composites, vous avez donc écrit votre propre SelectGenerator
étendu ou utilisez une seule chaîne id_sub_id
colonne qui combine l'id et le sous-id dans une seule colonne VARCHAR :
'1-0'
'1-1'
'2-0'
'2-1'
Vous devez écrire un déclencheur de base de données pour mettre à jour les deux colonnes à l'aide d'une procédure stockée spécifique à la base de données et agréger les deux colonnes dans la VARCHAR. Vous mappez ensuite la colonne agrégée à l'aide du standard SelectGenerator
à un champ String :
@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;
}