Mysql
 sql >> Database >  >> RDS >> Mysql

Spiegare i comportamenti nella mappatura della sequenza di ID compositi con incremento automatico con Hibernate

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