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

Forklar adfærd ved kortlægning af automatisk øget sammensat id-sekvens med Hibernate

Siden id feltet er allerede unikt og automatisk forøget, du behøver ikke et sammensat id i dette tilfælde, så din enhed kan se sådan ud:

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

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

Enheden kan hentes ved hjælp af id ved hjælp af enhedsadministratoren:

entityManager.find(MyEntity.class, entityId); 

eller du kan hente entiteten ved hjælp af en forespørgsel, der tager både id og 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 også en SelectGenerator der kan hente id'et fra en databasekolonne, hvilket er nyttigt, når databasen genererer id'et ved hjælp af en trigger.

Desværre virker det ikke med sammensatte id'er, så du visner skrev din egen udvidede SelectGenerator eller brug en enkelt streng id_sub_id kolonne, der kombinerer id og sub-id til en enkelt VARCHAR kolonne:

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

Du skal skrive en databaseudløser for at opdatere de to kolonner ved hjælp af en databasespecifik lagret procedure og aggregere de to kolonner i VARCHAR-en. Du kortlægger derefter den aggregerede kolonne ved hjælp af standard SelectGenerator til et strengfelt:

@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. LOAD DATA INFILE virker ikke

  2. ANDROID&PHP - Sådan viser du JSONArray fra MySql ved hjælp af PHP

  3. Type mismatch:kan ikke konvertere fra java.util.Date til java.sql.Date

  4. det leverede argument er ikke en gyldig MySQL-resultatressource