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

Hibernate @SQLInsert a On Duplicate Key

Správná odpověď by byla použít následující tvrzení:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB);

Poté se však objeví problém, že hibernace neobdržela zpět hodnotu automatického přírůstku, jakmile byl proveden příkaz aktualizace.

Našel jsem následující blogový příspěvek (http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) a upravil dotaz na následující:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);

což konečně funguje.

Neřešitelným problémem tohoto přístupu je, že nefunguje vložení dvou entit, které jsou stejné v rámci stejné transakce. I kdyby druhé vložení způsobilo správnou aktualizaci, em by skončily se 2 instancemi entity představujícími stejný řádek databáze - což není povoleno.

Chcete-li to vyřešit, stačí zajistit, abyste nevložili 2 entity, které jsou kvůli svým omezením vykresleny stejně. (Použil jsem stejnou logiku pro rovné/hashcode jako omezení složeného jedinečného klíče, takže jsem schopen takové duplikáty eliminovat při provádění dávkových vložení)




  1. jak automaticky vkládat odkazy na cizí klíč do tabulek v mysql nebo JDBC?

  2. Jak monitorovat stav instancí databáze

  3. Jak najdu uloženou proceduru obsahující <text>?

  4. Tabulka je specifikována dvakrát, jak jako cíl pro 'UPDATE', tak jako samostatný zdroj dat v mysql