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

@GeneratedValue полиморфен абстрактен суперклас над MySQL

Каква бъркотия... AUTO_INCREMENT е скритата последователност на MySQL. Радикалният проблем е, че MySQL не може да вмъкне и върне PK едновременно, но Hibernate се нуждае от това, докато INSERT въвеждане на нов обект.

Проблемите, с които се сблъсквате:

  1. Ако Hibernate запази нов Entity, той се опитва да зададе имердентно идентификатора на новия EntityBean. Следователно hibernate трябва да прочете какъв идентификатор ще използва базата данни, преди хибернацията да запише новия кортеж в таблицата.
  2. Ако имате няколко сървъра, които имат достъп до базата данни, трябва да оставите фабриката за сесии на hibernate да реши да използва вградената последователност (AUTO-INCREMENT) или да оставите hibernate да реши (GenerationType.AUTO /GenerationType.IDENTITY ) колко голям е отвореният диапазон от запазени ПК (работа на DB-архитект). (Имаме около 20 сървъра към една база данни, така че на добре използвана маса използваме PK-разстояние от +100). Ако само един сървър има достъп до базата данни GenerationType.TABLE ще бъде правилно.

Hibernate трябва сами да изчисли следващия идентификатор, като използвате max(*)+1 но:

  • Ами ако две заявки поискат max(*)+1 по едно и също време/със същия резултат? Вдясно:Последният опит за insert ще се провали.

Така че трябва да имате таблица LAST_IDS в базата данни, който съхранява последните Table-PK. Ако искате да добавите такъв, трябва да направите следните стъпки:

  1. Започнете оптимистична транзакция за четене.
  2. ИЗБЕРЕТЕ MAX(address_id) ОТ LAST_IDS
  3. съхранявайте максимума в java-променлива, т.е.:$OldID.
  4. $NewID =$OldID + 1. (+100 при песимистично заключване)
  5. АКТУАЛИЗИРАНЕ НА LAST_IDS SET address_id=$newID WHERE address_id=$oldID ?
  6. завържете оптимистичната транзакция за четене.
  7. ако комитирането е било успешно, съхранете $newID към setID() в HibernateBean, който искате да запазвате.
  8. Накрая оставете Hibernate да извика вмъкването.

Това е единственият начин, който знам.

BTW:Hibernate-Entitys ще използва наследяване само ако базата данни поддържа наследяване между таблици като PostgreSQL или Oracle .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да създам изглед с параметър в MySQL?

  2. Как да се свържете с MySQL от командния ред

  3. PHP връзката е неуспешна:SQLSTATE[HY000] [2002] Връзката е отказана

  4. Mysql разделяне на низ

  5. JSON_MERGE_PATCH() срещу JSON_MERGE_PRESERVE() в MySQL:Каква е разликата?