Szoftverfejlesztés J2EE platformon - Entity bean
Adatbázis-független módszer
Az ejb projekten a New / Entity Classes from Database... menüpont legenerálja a kész adatbázisból az entity beaneket. A keletkező .java file-okban az elsődleges kulcsot reprezentáló változó (pl.
private Integer id;
) elé írjuk be a =@GeneratedValue= annotációt. Ennek hatására létrejön egy =SEQUENCE= nevű tábla, amiben a következő kulcsot generálódik.
A módszer hátrányai:
- Lassú, mert minden beszúrás előtt meghív egy select-et és egy update-et is.
- Ha az adatbázis eredetileg már tartalmazott rekordokat, akkor is 1-gyel kezdi az indexek számozását, így ütközés léphet fel.
Adatbázis-függő módszer
Megadjuk az annotációban, hogy milyen stratégiával generálja a kulcs következő értékét. Az =GenerationType=AUTO= alapbeállítás a leírásával ellentétben nem detektálja az adatbáziskezelőt, és nem használja ki az egyedi megoldásokat.
Microsoft SQL Server esetén a következőképpen kell eljárni:
- Használjuk az IDENTITY stratégiát: =@GeneratedValue(strategy=GenerationType.IDENTITY)=
- A táblákat létrehozó scriptet is módosítsuk, hogy automatikusan generálja a kulcsot:
=id int NOT NULL PRIMARY KEY IDENTITY= - Ha rekordokat szúrunk be a scriptből, nem szabad megadni az id értékét.
- Ha mégis kézzel akarjuk megadni, előtte ki kell adni egy =SET IDENTITY_INSERT táblanév ON= parancsot.
- A legutoljára beszúrt rekord kulcsát a =@@IDENTITY= változó tartalmazza.
- Ha nem globálisan, hanem egy konkrét táblára kell az utolsó kulcs, az =IDENT_CURRENT(táblanév)= függvénnyel kérdezhető le.
Oracle-ben IDENTITY helyett táblától független SEQUENCE objektumokat kell használni (nem teszteltem):
- Stratégia megadása: =@GeneratedValue(strategy=GenerationType.SEQUENCE)=
- Szekvencia létrehozása: =CREATE SEQUENCE seq=
- Beszúrás: =INSERT INTO táblanév (id, ...) VALUES (seq.nextval, ...)=
- Utolsó kulcs lekérdezése: =seq.curval=
Ha van tapasztalatod MySQL-lel vagy PostgreSQL-lel kapcsolatban, légyszi írd le ide!
-- Peti - 2006.11.25.