IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

[BES] CreateException avec ejb.CacheCreate=true [EJB2.1 Entity]


Sujet :

Java EE

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut [BES] CreateException avec ejb.CacheCreate=true
    Bonjour à tous,

    J'utilise Borland Enterprise Server 5.2 pour développer un projet J2EE. Tous mes beans d'entité ont la propriété ejb.CacheCreate à true pour pouvoir définir les champs de relations (cmr fields) dans les méthodes ejbPostCreate().

    Le problème est que dans le cas d'un problème de clé primaire dupliquée, l'exception levée par le conteneur EJB est une exception système (RemoteException) et non une DuplicateKeyException ou une CreateException. La transaction est donc annulée correctement mais je perds l'information sur l'origine de l'erreur. Si je positionne ejb.CacheCreate à false, j'obtiens bien une DuplicateKeyException mais dans ce cas je ne peux pas utiliser ejbPostCreate(): la commande SQL INSERT a lieu avant, ce qui provoque une erreur si les clés étrangères mappant les champs de relation ne doivent pas valoir NULL.

    J'espère que j'ai été clair et que quelqu'un pourra m'aider à m'en sortir...
    Merci d'avance !

    Baptiste

    PS. Merci de m'indiquer le forum le plus approprié si je ne poste pas au bon endroit.

  2. #2
    Membre éprouvé
    Avatar de request
    Inscrit en
    Novembre 2002
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 328
    Points : 1 248
    Points
    1 248
    Par défaut
    Bonjour Bobby McGee,

    Je suis heureux de voir que tu utilises BES.

    Pour la réponse à ta question:
    C'est un Bug corrigé dans le patch1 de BES 5.2.1

  3. #3
    Membre éprouvé
    Avatar de request
    Inscrit en
    Novembre 2002
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 328
    Points : 1 248
    Points
    1 248
    Par défaut
    Tu peux t'en sortir autrement, BES supporte la possibilité d'utiliser les attibuts de la relation en plus des champs CMR, donc tu peux tout utiliser dans l'ejbCreate sans cette propriété.

    C'est de plus conforme à la spec.

    On a eu un longue discution sur le sujet:
    http://www.developpez.net/forums/viewtopic.php?p=488801

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci pour tes réponses.

    J'ai lu votre discussion précédente, mais je me pose encore des questions. L'option ejb.CacheCreate interdit visiblement la remontée des CreateException: c'est finalement logique vu que cette option retarde la création des entités jusqu'au commit de la transaction. Donc pour l'instant on oublie ejb.CacheCreate.

    Dans ce cas je suis obligé de tout définir dans les méthodes ejbCreate(), y compris les attributs des relations. Je trouve ça pénible, pour moi un des intérêts des CMR est de masquer au niveau des beans d'entité la façon dont leurs relations sont mappées en BD.

    Pour parler de mon petit cas personnel, j'ai une relation 1:n entre 2 beans, Project et Version. Avec cette solution, je suis obligé de définir un attribut projectId dans Version et de faire setProjectId() dans Version.ejbCreate() au lieu de faire setProject() dans Version.ejbPostCreate() en me reposant sur le conteneur EJB pour définir le champ projectId dans la base.

    D'un autre côté, définir projectId dans Version est peut-être la bonne méthode, ça résoud ce problème et en plus ça économise des requêtes BD: si on connait projectId, on n'est pas obligé de faire un ProjectHome.findByPrimaryKey() pour récupérer l'entité Project avant de créer une Version.

    Je vais quand même me renseigner côté BES pour voir ce que corrige le patch...

    Baptiste

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Je viens d'aller faire un tour chez Borland pour connaître les détails sur le patch 5.2.1. La nouvelle option qui semble intéressante est ejb.cmp.checkExistenceBeforeCreate. La question est de savoir si avec cette option et ejb.CacheCreate activées, on peut définir les relations dans ejbPostCreate() tout en récupérant une DuplicateKeyException en cas de clé primaire dupliquée.

    Si qqun a des infos là-dessus, je suis preneur ! Merci,

    Baptiste

  6. #6
    Membre éprouvé
    Avatar de request
    Inscrit en
    Novembre 2002
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 328
    Points : 1 248
    Points
    1 248
    Par défaut
    Je ne parlai pas de BES 5.2.1, je parlai du Patch 1 de BES 5.2.1.
    Ce patch corrige spécifiquement des choses sur ejb.CacheCreate, ce patch est accessible en passant par le support.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    OK, merci pour la précision.

    Comme je ne suis pas certain de pouvoir faire évoluer la version de BES (qui tournera sous HP-UX chez notre client), je m'oriente vers la solution la moins mauvaise (selon moi): désactiver les contraintes NOT NULL sur les clés étrangères des tables. C'est moyen, mais vu que la BD n'est accédée que par mes beans d'entité et que les données passées en paramètre sont controlées, ca peut être une solution acceptable.

    En tout cas j'ai l'impression que ca vaut mieux que de rajouter des attributs correspondant aux clés étrangères dans mes beans. Vos avis sur ce sujet sont les bienvenus... Merci d'avance,

    Baptiste

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser Spring avec EJB
    Par rOmAle dans le forum Spring
    Réponses: 5
    Dernier message: 03/04/2007, 17h30
  2. Réponses: 2
    Dernier message: 19/11/2006, 10h54
  3. [configuration] JBoss 4.0.2 avec EJB, JNDI, JSP/Servlets
    Par ran_hery dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 28/08/2006, 14h49
  4. [Install] JBoss 4.0.4 avec EJB 3 ?
    Par ghohm dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 04/08/2006, 09h40
  5. [EJBQL] Récupérer une donnée dans un EJB avec EJB/QL
    Par pblb62 dans le forum Java EE
    Réponses: 3
    Dernier message: 28/03/2006, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo