Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erklären Sie das Verhalten bei der Zuordnung von automatisch inkrementierten zusammengesetzten ID-Sequenzen mit Hibernate

Da die id Feld bereits eindeutig ist und automatisch erhöht wird, brauchen Sie in diesem Fall keine zusammengesetzte ID, damit Ihre Entität so aussehen kann:

@Id
@Column(name = "id")
public long getId() {
    return id;
}

@Column(name = "subid")
public int getSubid() {
    return subid;
}

Die Entität kann mit dem Entitätsmanager nach ID abgerufen werden:

entityManager.find(MyEntity.class, entityId); 

oder Sie könnten die Entität mit einer Abfrage abrufen, die sowohl die id nimmt und die 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 hat auch einen SelectGenerator die die ID aus einer Datenbankspalte abrufen kann, was nützlich ist, wenn die Datenbank die ID mithilfe eines Triggers generiert.

Leider funktioniert es nicht mit zusammengesetzten IDs, also haben Sie Ihren eigenen erweiterten SelectGenerator geschrieben oder verwenden Sie eine einzelne Zeichenfolge id_sub_id Spalte, die die ID und die Sub-ID in einer einzigen VARCHAR-Spalte kombiniert:

'1-0'
'1-1'
'2-0'
'2-1' 

Sie müssen einen Datenbank-Trigger schreiben, um die beiden Spalten mit einer datenbankspezifischen gespeicherten Prozedur zu aktualisieren und die beiden Spalten in die VARCHAR-Spalte zu aggregieren. Anschließend ordnen Sie die aggregierte Spalte mit dem standardmäßigen SelectGenerator zu zu einem String-Feld:

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