sql >> Databasteknik >  >> RDS >> Mysql

Förklara beteenden vid kartläggning av automatisk inkrementerad sammansatt id-sekvens med Hibernate

Sedan id fältet är redan unikt och automatiskt inkrementerat, du behöver inte ett sammansatt id i det här fallet så din enhet kan se ut så här:

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

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

Entiteten kan hämtas med id med hjälp av entitetshanteraren:

entityManager.find(MyEntity.class, entityId); 

eller så kan du hämta entiteten med en fråga som tar både id och 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 har också en SelectGenerator som kan hämta id:t från en databaskolumn, vilket är användbart när databasen genererar id:t med en trigger.

Tyvärr fungerar det inte med sammansatta ID, så du vissna skrev din egen utökade SelectGenerator eller använd en enda sträng id_sub_id kolumn som kombinerar id och sub-id till en enda VARCHAR kolumn:

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

Du måste skriva en databasutlösare för att uppdatera de två kolumnerna med hjälp av en databasspecifik lagrad procedur och aggregera de två kolumnerna till VARCHAR-en. Du mappar sedan den aggregerade kolumnen med standard SelectGenerator till ett strängfält:

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


  1. XML-fel vid et-tecken (&)

  2. mysql-tjänsten startar inte/lägger på - timeout (Ubuntu, MariaDB)

  3. kör *.sql-fil med python MySQLdb

  4. Hur man skapar en användare och beviljar behörigheter i Oracle