[EJB] primary key generée par un trigger, non retournée ?

primary key generée par un trigger, non retournée ? [EJB] - Java - Programmation

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  

Citation :


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?

Reply

Marsh Posté le 04-11-2004 à 19:44:29   

Reply

Marsh Posté le 04-11-2004 à 19:45:24    

[:cupra]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

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 ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 04-11-2004 à 19:49:19    

the real moins moins a écrit :


Une idée de ce que je peux faire?


 
danser la carmagnole ?

Reply

Marsh 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

Reply

Marsh Posté le 04-11-2004 à 20:45:55    

ça fait longtemps que t'y bosses ? :o


Message édité par Harkonnen le 04-11-2004 à 20:46:34

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-11-2004 à 20:48:08    

mais arretez de pourrir mon topic [:sisicaivrai]

Reply

Marsh Posté le 04-11-2004 à 20:51:27    

Spour ton bien, un topic avec plein de reponses attire plus de monde [:icon7]

Reply

Marsh Posté le 04-11-2004 à 20:52:15    

Harkonnen a écrit :

ça fait longtemps que t'y bosses ? :o


 
fortune :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 04-11-2004 à 20:53:24    

[:dawa]


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2004 à 20:53:24   

Reply

Marsh Posté le 04-11-2004 à 20:55:36    

the real moins moins a écrit :

mais arretez de pourrir mon topic [:sisicaivrai]


[:chapi]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 04-11-2004 à 21:56:25    

[:blueflag]
intéressant ...


Message édité par darklord le 04-11-2004 à 21:56:34

---------------
Just because you feel good does not make you right
Reply

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

Reply

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 !


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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

Reply

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)

Reply

Marsh Posté le 04-11-2004 à 23:27:34    

julienv a écrit :

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

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 :p


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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)

Reply

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 [:kiki]
 
 
sinon, je viens de voir le planning des formations jboss [:cupra]
(c cher :sweat:)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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


Message édité par nraynaud le 04-11-2004 à 23:38:15

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2004 à 23:37:44    

viens a paris en decembre :-)

Reply

Marsh Posté le 04-11-2004 à 23:45:41    

julienv a écrit :

viens a paris en decembre :-)

tu m'offres une place? :p


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 04-11-2004 à 23:47:03    

malheureusement je ne peux pas

Reply

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 :/


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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

Reply

Marsh Posté le 04-11-2004 à 23:54:31    

blah.NEXTVAL c est une sequence ?

Reply

Marsh Posté le 04-11-2004 à 23:56:54    

blah est une séquence oui.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-11-2004 à 23:58:37    

je confirme


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh 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

Reply

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..


Message édité par the real moins moins le 05-11-2004 à 00:06:02

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-11-2004 à 00:06:46    

rien ne t empeche de faire ta commande :-), le principe est la.

Reply

Marsh Posté le 05-11-2004 à 00:07:14    

julienv a écrit :

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

Code :
  1. sql.append(sequence+".NEXTVAL, " );


http://www.allojunior.org/english/images/ssdossiers/Sport/rules_history/arbitre.jpg
 
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 ?


---------------
trainoo.com, c'est fini
Reply

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 ? )


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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).


---------------
trainoo.com, c'est fini
Reply

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 :p
 

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à :heink:
(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 :


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).


:jap:


Message édité par the real moins moins le 05-11-2004 à 00:26:46

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed