sql >> Databáze >  >> RDS >> Mysql

Vysvětlete chování při mapování sekvence automatického zvýšení složeného ID pomocí režimu spánku

Protože id pole je již jedinečné a automaticky se zvyšuje, v tomto případě nepotřebujete složené ID, takže vaše entita může vypadat takto:

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

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

Entitu lze načíst podle id pomocí správce entity:

entityManager.find(MyEntity.class, entityId); 

nebo můžete entitu načíst pomocí dotazu, který přebírá obě id a 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 má také SelectGenerator který dokáže načíst ID ze sloupce databáze, což je užitečné, když databáze generuje ID pomocí spouštěče.

Bohužel to nefunguje se složenými ID, takže jste si napsali svůj vlastní rozšířený SelectGenerator nebo použijte jeden řetězec id_sub_id sloupec, který kombinuje id a sub-id do jednoho sloupce VARCHAR:

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

Musíte napsat spouštěč databáze, abyste aktualizovali dva sloupce pomocí uložené procedury specifické pro databázi a agregovali dva sloupce do sloupce VARCHAR. Potom namapujete agregovaný sloupec pomocí standardního SelectGenerator do pole Řetězec:

@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. Konfigurace databázové pošty na serveru SQL

  2. Problém s blokem PL/SQL:Chyba nenalezena žádná data

  3. Konfigurace posluchače v databázi Oracle (edice 12c, 18c a 19c)

  4. Tabulka MySQL -> Můžete vrátit stejný řádek vícekrát ve stejném dotazu?