Mysql
 sql >> база данни >  >> RDS >> Mysql

Хибернация @SQLInsert и при дублиран ключ

Правилният отговор би бил да се използва следното твърдение:

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

Тогава обаче проблемът изглежда, че hibernate не е получил обратно стойност за автоматично увеличение, след като операторът за актуализиране е изпълнен.

Намерих следната публикация в блога (http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) и модифицира заявката на следното:

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

което най-накрая работи.

Неразрешим проблем с този подход е, че вмъкването на две единици, които са равни в рамките на една и съща транзакция, не работи. Дори ако второто вмъкване би причинило правилната актуализация, em ще завърши с 2 екземпляра на обекта, представляващи един и същ ред на базата данни - което не е разрешено.

За да разрешите това, просто трябва да се уверите, че не вмъквате 2 субекта, които се изравняват поради техните ограничения. (Използвах същата логика за equals/hashcode като ограничението за съставен уникален ключ, така че мога да премахна такива дубликати при извършване на пакетни вмъквания)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка в набора от данни на Visual Studio MySQL

  2. Mysql - Как да сравним два Json обекта?

  3. Топ 'n' резултати за всяка ключова дума

  4. Как да задам изчакване на заявка в Sequelize?

  5. jquery datatable сървърна страна в codeigniter не работи