Mysql
 sql >> Base de données >  >> RDS >> Mysql

Expliquer les comportements lors du mappage d'une séquence d'ID composite incrémentée automatiquement avec Hibernate

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;
}