Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Java + Autoincrement BDD (Oracle)

8 réponses
Avatar
Latyr
Bonjour

J'ai une application qui est en cours de développemnt et qui utilise Oracle
comme BDD.
Je veux respecter le paradime MVC2 et donc que avoir dans mon application 3
tiers, je souhaite qu'il n'y ait que du stockage dans la BDD.
Cependant pour gérer l'autoincrément, je ne sait pas comment faire.
Effectivement il y a toujours la solution d'une variable de classe statique
mais il faudra gérer la persistance.
Créer des séquences (donc un autoincrement) se fait en utilisant le couple
trigger/sequence sous Oracle.

Dans l'optique de garder mon appli conforme et cross BDD, je voudrais
savoir si je peux créer une fonction en Java qui aille récupérer le No de
seq.
donc dans mon insert j'aurais :
INSERT INTO table(ID, col1) VALUE ('GénérerAutoIncrement', 'val1');
Si je migre sous SQL Server ou DB2, je n'ai qu'a changer le code de la
fonction GénérerAutoIncrement.
De la sorte ma BDD même si j'utilise des fonctions Oracle, au niveau de la
programmation, je peux considérer que je ne fais que du stockage de données
et aucun traitement

Merci de m'expliquer comment je pourrais m'y prendre.

Latyr

8 réponses

Avatar
Philippe Vandenbulcke
Bonjour

J'ai une application qui est en cours de développemnt et qui utilise Oracle
comme BDD.
Je veux respecter le paradime MVC2 et donc que avoir dans mon application 3
tiers, je souhaite qu'il n'y ait que du stockage dans la BDD.
Cependant pour gérer l'autoincrément, je ne sait pas comment faire.
Effectivement il y a toujours la solution d'une variable de classe statique
mais il faudra gérer la persistance.
Créer des séquences (donc un autoincrement) se fait en utilisant le couple
trigger/sequence sous Oracle.

Dans l'optique de garder mon appli conforme et cross BDD, je voudrais
savoir si je peux créer une fonction en Java qui aille récupérer le No de
seq.
donc dans mon insert j'aurais :
INSERT INTO table(ID, col1) VALUE ('GénérerAutoIncrement', 'val1');
Si je migre sous SQL Server ou DB2, je n'ai qu'a changer le code de la
fonction GénérerAutoIncrement.
De la sorte ma BDD même si j'utilise des fonctions Oracle, au niveau de la
programmation, je peux considérer que je ne fais que du stockage de données
et aucun traitement

Merci de m'expliquer comment je pourrais m'y prendre.

Latyr



Mieux vaut laisse la db gérer l'auto incrément; c'est essentiel en tout

cas si l'on travaille multi utilisateurs... Travailler en trois tiers
peut éviter ce écueil jusqu'au jour où il y aura une création
interactive sur un moniteur de la db! (pour des tests, une vérif, une
urgence en correction...)
Il y une fonction dans jdbc qui récupère le nr après insertion. Cela
est donc standard et portable.
vdb

Avatar
Pimousse
Bonjour


Salut,


J'ai une application qui est en cours de développemnt et qui utilise Oracle
comme BDD.
Je veux respecter le paradime MVC2 et donc que avoir dans mon application 3
tiers, je souhaite qu'il n'y ait que du stockage dans la BDD.
Cependant pour gérer l'autoincrément, je ne sait pas comment faire.
Effectivement il y a toujours la solution d'une variable de classe statique
mais il faudra gérer la persistance.
Créer des séquences (donc un autoincrement) se fait en utilisant le couple
trigger/sequence sous Oracle.

Dans l'optique de garder mon appli conforme et cross BDD, je voudrais
savoir si je peux créer une fonction en Java qui aille récupérer le No de
seq.


si tu veux garder une implémentation réellement cross-bdd, je te
conseille d'utiliser l'api jdo.
en effet, tu ne te préoccupes pas de la bdd que tu utilises.
j'avais utilisé l'implémentation LiDO de Libelis (mais bon version
gratuite communautaire, qui a plusieurs inconvénients notamment celui de
ne pouvoir ouvrir que 2 persistentManager simultanés)

regarde sur ce forum le post du 23/04/04 intitulé "Meilleure
Alternative" ainsi que celui 05/03/04 intitulé "JDO : quel outil choisir ?"

pour gérer l'autoincrement, une méthode simple et cross-bdd consiste à
créer une table supplémentaire avec deux colonnes : le nom de la table
et la prochaine valeur de l'id à insérer.
ça marche bien du moins chez moi.

@++
Pimousse

Avatar
Fred BROUARD - SQLpro
Une solution CROSS plateforme consiste à utiliser une table des clefs comme indiqué dans l'article que j'ai écrit à ce
sujet :
http://sqlpro.developpez.com/ClefsAuto/SQL_ClefsAuto.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/ClefsAuto/SQL_ClefsAuto.html

A +


--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************

Latyr a écrit:
Bonjour

J'ai une application qui est en cours de développemnt et qui utilise Oracle
comme BDD.
Je veux respecter le paradime MVC2 et donc que avoir dans mon application 3
tiers, je souhaite qu'il n'y ait que du stockage dans la BDD.
Cependant pour gérer l'autoincrément, je ne sait pas comment faire.
Effectivement il y a toujours la solution d'une variable de classe statique
mais il faudra gérer la persistance.
Créer des séquences (donc un autoincrement) se fait en utilisant le couple
trigger/sequence sous Oracle.

Dans l'optique de garder mon appli conforme et cross BDD, je voudrais
savoir si je peux créer une fonction en Java qui aille récupérer le No de
seq.
donc dans mon insert j'aurais :
INSERT INTO table(ID, col1) VALUE ('GénérerAutoIncrement', 'val1');
Si je migre sous SQL Server ou DB2, je n'ai qu'a changer le code de la
fonction GénérerAutoIncrement.
De la sorte ma BDD même si j'utilise des fonctions Oracle, au niveau de la
programmation, je peux considérer que je ne fais que du stockage de données
et aucun traitement

Merci de m'expliquer comment je pourrais m'y prendre.

Latyr





Avatar
Ulrich Vachon
Il y une fonction dans jdbc qui récupère le nr après insertion. Cela
est donc standard et portable.
vdb
Ah bon ? Ca m'intéresse ça. Tu peux m'en dire plus dessus, stp.


Bon code,
Ulrich.

Avatar
Philippe Vandenbulcke
Il y une fonction dans jdbc qui récupère le nr après insertion. Cela
est donc standard et portable.
vdb


Ah bon ? Ca m'intéresse ça. Tu peux m'en dire plus dessus, stp.

Bon code,
Ulrich.




Désolé, c'est moins beau que je ne le pensais. Ce n'est pas natif SQL

mais un truc programmé. Avec un peu de chances, c'est implémentable sur
la pluspart des systèmes bd. Cela marche à peu près commpe suit:
insertion d'un record via une procédure stockée qui récupère le nr
incrémenté et le remballe dans un resultset qui lui est lu dans le cadre
jdbc... Un peu lourd mais cela marche.
vdb


Avatar
Ulrich Vachon
"Philippe Vandenbulcke" a écrit dans le message
de news:4097e36c$
Il y une fonction dans jdbc qui récupère le nr après insertion. Cela
est donc standard et portable.
vdb


Ah bon ? Ca m'intéresse ça. Tu peux m'en dire plus dessus, stp.

Bon code,
Ulrich.




Désolé, c'est moins beau que je ne le pensais. Ce n'est pas natif SQL

mais un truc programmé. Avec un peu de chances, c'est implémentable sur
la pluspart des systèmes bd. Cela marche à peu près commpe suit:
insertion d'un record via une procédure stockée qui récupère le nr
incrémenté et le remballe dans un resultset qui lui est lu dans le cadre
jdbc... Un peu lourd mais cela marche.
vdb


En effet, cela m'étonnais qu'il y ait une solution 100% JDBC pour faire
cela. Mais ton idée est tout à fait convenable du point de JDBC, car le nom
de procédure SQL ne diffère pas et il suffit de ré-implémenter celle-ci au
niveau SGBD. Quant à moi, j'étais partis sur un truc :

- 1 : Insertion du record dont je souhaite avoir l'ID, avec un flag
d'identification (ex.: new Date().getTime()),
- 2 : Select de l'ID en fonction du flag.

Le truc à peine lourdingue...

Merci de ta réponse,
Bon code,
UL



Avatar
Latyr_Dev
Merci pour vos réponses.
J'en déduis que la solutions la plus efficace demeure néanmoins
l'utilisation des méchanismes d'auto incréments propres à chaques bas es
de données.

Merci encore

Cdt

Latyr
Avatar
Pasturel
Christophe Garault a écrit:
Dans le message ,
Latyr_Dev écrivit...


J'en déduis que la solutions la plus efficace demeure néanmoins
l'utilisation des méchanismes d'auto incréments propres à chaques bases
de données.



Pour un vieux de la vieille la question ne se pose même pas. Et
ne voyez aucune agressivité dans mes propos, mais depuis le temps que
je vois des gens appliquer cet intégrisme consistant à ne mettre aucun
traitement dans les SGBDR (moi je fais exactement le contraire) j'en
finit par me demander s'il ne s'agit pas de la résultante de
l'enseignement suivi?

Je ne lance pas un troll et je ne veux pas voir ce fil dégénérer
entre pros 'portabilité' et pros 'performance' je veux juste savoir si
les programmes d'enseignement d'aujourd'hui recommandent de ne placer
aucun code dans les SGBD.

Merci de m'avoir lu jusqu'ici.

PS: pour ceusses qui souhaitent débattre sur ce thème, il serait
souhaitable de lancer un nouveau fil de discussion...

Pas tout jeune non-plus, mais je partage en partie cet opinion. J'ai eu

récemment l'occasion de travailler sur un gros Projet Oracle Application
( qui utilise donc le SGBD Oracle), et dans cet ERP tout le métier est
porté par des procédures PLSQL, la présentation est un applet Java, ou
des pages JSP ou PLSQL ( mod-plsql) , bien que le produit intègre iAS 9i.
J'ai posé la question à des développeurs Oracle sur le portage EJB du
métier, ils m'ont répondu que le PLSQL était plus rapide et qu'il n'en
était pas question dans les prochaines versions ( vue à 12 ou 18
mois)... et Oracle est aussi un acteur majeur dans JAVA.
C'est vrai que l'on prone l'architecture 5 couches, et la cinquième
couche est la database qui doit être aussi neutre que possible et on
singe des comportements SGBD dans les couches amont !