primary key generée par un trigger, non retournée ? [EJB] - Java - Programmation
Marsh Posté le 04-11-2004 à 19:45:24
Marsh Posté le 04-11-2004 à 19:49:04
Oui. C'est lié au système de synchro de données entre la base et ton EJB via le container (avec entre autre le dirty). Pour controler cela, c'est malheureusement très dépendant du serveur d'application. Tu utilise quoi ?
Marsh Posté le 04-11-2004 à 19:49:19
ReplyMarsh Posté le 04-11-2004 à 19:49:44
kadreg a écrit : Oui. C'est lié au système de synchro de données entre la base et ton EJB via le container (avec entre autre le dirty). Pour controler cela, c'est malheureusement très dépendant du serveur d'application. Tu utilise quoi ? |
jboss
Marsh Posté le 04-11-2004 à 20:45:55
ça fait longtemps que t'y bosses ?
Marsh Posté le 04-11-2004 à 20:51:27
Spour ton bien, un topic avec plein de reponses attire plus de monde
Marsh Posté le 04-11-2004 à 20:52:15
Harkonnen a écrit : ça fait longtemps que t'y bosses ? |
fortune
Marsh Posté le 04-11-2004 à 20:55:36
the real moins moins a écrit : mais arretez de pourrir mon topic |
Marsh Posté le 04-11-2004 à 21:56:25
intéressant ...
Marsh Posté le 04-11-2004 à 22:23:30
fo utiliser les EntityCommand, j'explique :
quand une clef est generee par la DB il faut que le container la recupere.
dans ce cas la il faut utiliser une entity command qui va se charger de ca.
la commande va etre executee apres l'insertion et va avoir en param
lors de l execution la connection qui a fait l insert.
apres suivant la db, la clef est recuperee, ca peut etre un cast vers
un driver specifique ou alors l execution d'une requete speciale.
la ton cas a l'air exotique et je ne sais pas si une entity command pour
ca existe deja, autrement il y a pas mal d'entity command qui existe
(mysql/oracle/hsqldb/sybase/jdbc3/etc....)
julien
Marsh Posté le 04-11-2004 à 22:45:51
Salut,
J'ai tenté l'aventure entity-command, mais un peu au hasard, faute de doc (la notre doit dater de 3.2.2 je crois, et sur le web j'ai rien trouvé d'explicite) ... J'ai donc tenté de coller l'entity command oracle-sequence sur mon entity, mais manque de pot, ça n'a rien voulu savoir sous pretexte que ma pk est composée de plusieurs champs.
Et je n'ai toujours pas bien compris ce que c'est supposé faire... executer une commande, oui bien, mais, et après... ? je la recuperer ou/comment ma pk ?
En tous cas, si tu as un lien ou l'autre sous le coude, ça m'interesse merci !
Marsh Posté le 04-11-2004 à 23:25:37
voila le timing :
execute ejbCreate()
insert statetement dans la BD
recupere la PK par l entity command (execute par le moteur CMP)
positionne la PK sur l instance de l'ejb
execute ejbPostCreate()
apres dans ton code tu fait :
ejb = home.create();
pk = ejb.getPrimaryKey();
apres pour l entity command, je vais te chch une doc qui explique ca
Marsh Posté le 04-11-2004 à 23:26:16
ya la doc complete en ligne sur jboss.org en etant member plus (une registration suffit, c'est pas mechant)
Marsh Posté le 04-11-2004 à 23:27:34
julienv a écrit : voila le timing : |
ha ok, c'etait cette partie qui me manquait, et en survolant les sources de JDBCOracleEntityCommand (un truc du genre), ça m'a pas sauté aux yeux ... pas toujours évidentes à suivre les sources de jboss
Marsh Posté le 04-11-2004 à 23:33:30
en fait c est une feature qui est vendo specifique et non couverte par la spec (bien que prevue)
Marsh Posté le 04-11-2004 à 23:36:12
ouaip.. je viens de voir..
bordel, j'ai un compte sur jboss.org , je retrouve pas mon pass, et c'est ce soir que le webmail du boulot tombe en rade bien évidemment
sinon, je viens de voir le planning des formations jboss
(c cher )
Marsh Posté le 04-11-2004 à 23:37:26
heu on est dans du Jboss ou toujours dans la norme là ?
parce que générer "l'api de table" (exemple ici : http://nraynaud.com.free.fr/designer/ ) ça n'a rien d'exceptionnel, je serais étonné qu'il faille rentrer dans les particularités du serveur pour exploiter ça.
edit : j'étais en train de taper quand julienv a répondu
Marsh Posté le 04-11-2004 à 23:45:41
julienv a écrit : viens a paris en decembre :-) |
tu m'offres une place?
Marsh Posté le 04-11-2004 à 23:52:04
j'imagine
bon, j'ai encore deux questions:
- Tu sais pourquoi JDBCOracleCreateCommand refusait de fonctionner avec ma clé composée? Si oui, est-ce qu'en implementant moi-meme mon EntityCommand, je pourrai faire ça?
- La doc que j'ai trouvée, je l'avais déjà en imprimée, j'esperais trouver qques details quant à l'implementation d'une commande custom
Marsh Posté le 04-11-2004 à 23:53:26
on va t'envoyer le gros bebert t'expliquer ca et on va voir si tu peux toujours pas
Marsh Posté le 04-11-2004 à 23:56:54
blah est une séquence oui.
Marsh Posté le 04-11-2004 à 23:58:37
ReplyMarsh Posté le 04-11-2004 à 23:59:30
en fait d'apres le code :
http://cvs.sourceforge.net/viewcvs [...] iew=markup
l entity command pour oracle utilise la sequence, il execute le truc et ensuite positionne le field avec la valeur
Marsh Posté le 05-11-2004 à 00:03:04
ha ouais d'accord
http://cvs.sourceforge.net/viewcvs [...] iew=markup
il builde le INSERT INTO à la barbare directement là dedans quoi ... (c'est quoi ce truc qui comment par "{call" ??
.. et vu le code, mtnt je comprend pourquoi ça voulait pas fonctionner sur ma pk composée.
champbidule, qui est setté par le trigger, est un des 2 champs de la pk composée... dans mon home.create, je passe une valeur nulle pour ce champ, une valeur valide pour l'autre champ de la pk, et des valeurs quelconques pour les autres champs ...
... donc utiliser ça reviendrait à bypasser le trigger - et on sera donc content que ce trigger fasse un if machin null avant d'aller lui aussi pecher une valeur sur la sequence..
Marsh Posté le 05-11-2004 à 00:06:46
rien ne t empeche de faire ta commande :-), le principe est la.
Marsh Posté le 05-11-2004 à 00:07:14
julienv a écrit : en fait d'apres le code : |
Code :
|
par contre, tu peux pas laisser le trigger faire son boulot et juste faire le " RETURNING " pour éviter d'avoir des références à séquence qui se baladent partout ?
moins moins > il est bien "for each row" ton trigger ?
Marsh Posté le 05-11-2004 à 00:11:19
explique le carton jaune stp?
et pour l'histoire du returning, bah aucune idée; et oui si je me souviens bien il est en for each row ce trigger (ça veut dire quoi ? )
Marsh Posté le 05-11-2004 à 00:19:50
y'a une concaténation dans le append.
(bon et y'a aussi le pb de produire du SQL bien formé avec des manipulations de Strings parce que là on est au niveau du PHP et je subodore même que le nom de la séquence est tiré d'un fichier XML externe)
le for each row, ça veut dire qu'il concerne chaque ligne de l'évènement, sinon, c'est tout le statement, donc si dans le statement, t'as 40 lignes, ça va pêter (il y a donc 12 triggers possible sur une table : insert/delete/update, before/after et row/statement).
Marsh Posté le 05-11-2004 à 00:25:59
nraynaud a écrit : y'a une concaténation dans le append. |
ha, ce n'est que ça
nraynaud a écrit : (bon et y'a aussi le pb de produire du SQL bien formé avec des manipulations de Strings parce que là on est au niveau du PHP et je subodore même que le nom de la séquence est tiré d'un fichier XML externe) |
en meme temps, y'a largement assez d'indirections comme ça dans le code de jboss... et puis comme ici on fait de l'sql non standard, ça me parait relativement ok. deux unit tests et emballé, c'est pesé.
(sinon oui, le nom de la sequence viens du descripteur du bean en fait)
ça ne m'explique pas ce qu'est ce "{call" dans l'sql là
(je lis dans la doc de CallableStatement que c'est fait pour appeler des procédure stockées, y'a peut etre un lien? genre {call INSERT machin ça simule une P.S.?
nraynaud a écrit : |
Marsh Posté le 05-11-2004 à 00:36:46
the real moins moins a écrit : {call INSERT machin ça simule une P.S.? |
à tous les coups oui, mais ça doit être une extension du driver jdbc oracle (là je suis pas sur mon mac et la spec jdbc est dedans, donc as de vérif ce soir).
mais je suis pas *du tout* pour faire passer du code par jdbc, je suis pour les apis de tables, comme j'ai montré plus haut.
Marsh Posté le 04-11-2004 à 19:44:29
Plop,
Bon, gros problème ici: (mais peut etre trivial, j'espere)... Je crée un entity bean...
ZobLocal zob = home.create(null, blah, truc, machin);
le null, c'est un des champs de la pk composée. Sur la bd (oracle), y'a un trigger en "BEFORE INSERT" qui fait un truc du genre
IF:NEW.champbidule IS NULL THEN
SELECT blah.NEXTVAL INTO aBidule FROM dual;
:NEW.bidule =: aBidule;
END IF;
et d'autres trucs apres..
Manque de pot, quand apres mon create je fais zob.getPrimaryKey() ou zob.getBidule(), je me retrouve avec un beau null pour le champ que le trigger à pourtant bien rempli au niveau de la base.
Une idée de ce que je peux faire?