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

@GeneratedValue polymorfní abstraktní supertřída přes MySQL

Jaký nepořádek... AUTO_INCREMENT je skrytá sekvence MySQL. Radikální problém je, že MySQL nelze vložit a vrátit PK současně, ale Hibernate to potřebuje, zatímco INSERT vytvoření nové entity.

Problémy, na které narazíte:

  1. Pokud Hibernate uloží novou entitu, pokusí se nastavit id imerdentelly na novou EntityBean. Proto hibernace musí přečíst, jaké ID bude databáze používat, než hibernace uloží novou n-tice do tabulky.
  2. Pokud máte více serverů, které přistupují k databázi, musíte nechat továrnu relací hibernace, aby se rozhodla použít vestavěnou sekvenci (AUTO-INCREMENT) nebo nechat rozhodnout hibernaci (GenerationType.AUTO /GenerationType.IDENTITY ) jak velký je otevřený rozsah rezervovaných PK (Job of a DB-Architect). (Máme asi 20 serverů na jednu databázi, takže na dobře používaném stole používáme PK-vzdálenost +100). Pokud má pouze jeden server přístup k databázi GenerationType.TABLE bude správné.

Hibernate musí vypočítat další id sami pomocí max(*)+1 ale:

  • Co když dva požadavky požádají o max(*)+1 ve stejnou dobu/se stejným výsledkem? Vpravo:Poslední pokus o insert selže.

Takže potřebujete mít tabulku LAST_IDS v databázi, kdo ukládá poslední Table-PK's. Pokud chcete jeden přidat, musíte provést tyto kroky:

  1. Zahajte transakci optimalizovanou pro čtení.
  2. VYBERTE MAX (ID_adresy) Z LAST_IDS
  3. uložte maximum do proměnné java, např.:$OldID.
  4. $NewID =$StaréID + 1. (+100 v pesimistickém zámku)
  5. UPDATE LAST_IDS SET address_id=$newID WHERE address_id=$oldID ?
  6. potvrdit transakci optimalizovanou pro čtení.
  7. pokud bylo potvrzení úspěšné, uložte $newID na setID() v HibernateBean, který chcete uložit.
  8. Nakonec nechejte Hibernate zavolat insert.

Tohle je jediný způsob, jak to vím.

BTW:Hibernate-Entitys použijí dědičnost pouze v případě, že databáze podporuje dědičnost mezi tabulkami jako PostgreSQL nebo Oracle .



  1. SQL INSERT bez určení sloupců. Co se stalo?

  2. Klauzule Oracle DateTime in Where?

  3. Jak upgradovat MySQL 5.5 na 5.6 na Ubuntu 14.04

  4. Jak nasadit MariaDB Cluster 10.5 pro vysokou dostupnost