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 :

Colonne "GENERATED ALWAYS" ou "IDENTITY" pour les intimes


Sujet :

Java EE

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut Colonne "GENERATED ALWAYS" ou "IDENTITY" pour les intimes
    Hello les gens,
    Comment définit on généralement une méthode create (sur l'interface home) et la méthode ejbCreate (sur le bean) quand la clé de la table est de type identity ?
    Lorsque je désire créer un enregistrement sur la table, je me prends un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Caused by: java.sql.SQLException: A value cannot be specified for column "ID" which is defined as GENERATED ALWAYS. DSRA0010E: Etat SQL = 428C9, Code d'erreur = -798
    	at com.ibm.db2.jcc.b.id.e(id.java:1640)
    	at com.ibm.db2.jcc.b.id.a(id.java:1229)
    	at com.ibm.db2.jcc.c.fb.h(fb.java:149)
    	at com.ibm.db2.jcc.c.fb.a(fb.java:43)
    	at com.ibm.db2.jcc.c.s.a(s.java:30)
    	at com.ibm.db2.jcc.c.wb.g(wb.java:152)
    	at com.ibm.db2.jcc.b.id.n(id.java:1209)
    	at com.ibm.db2.jcc.b.jd.eb(jd.java:1779)
    	at com.ibm.db2.jcc.b.jd.a(jd.java:2232)
    	at com.ibm.db2.jcc.b.jd.W(jd.java:537)
    	at com.ibm.db2.jcc.b.jd.executeUpdate(jd.java:520)
    	at com.ibm.ws.rsadapter.cci.WSResourceAdapterBase.pmiExecuteUpdate(WSResourceAdapterBase.java:715)
    	at com.ibm.ws.rsadapter.cci.WSResourceAdapterBase.executeUpdate(WSResourceAdapterBase.java:584)
    	at com.laOuJeBosse.leProjet.ejb.entity.websphere_deploy.DB2UDBNT_V8_1.FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.Create(FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.java:238)
    	at com.laOuJeBosse.leProjet.ejb.entity.websphere_deploy.DB2UDBNT_V8_1.FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.execute(FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.java:872)
    	at com.ibm.ws.rsadapter.cci.WSInteractionImpl.execute(WSInteractionImpl.java:538)
    	at com.ibm.ws.rsadapter.cci.WSRelationalRAAdapter.executeCreate(WSRelationalRAAdapter.java:375)
    	at com.ibm.ws.ejbpersistence.dataaccess.DataAccessRequestImpl.execute(DataAccessRequestImpl.java:191)
    	... 16 more
    ---- Begin backtrace for Nested Throwables
    com.ibm.db2.jcc.b.SqlException: An error occurred during implicit system action type "2".  Information returned for the error includes SQLCODE "-798", SQLSTATE "428C9" and message tokens "ID".
    	at com.ibm.db2.jcc.b.id.e(id.java:1640)
    	at com.ibm.db2.jcc.b.jd.a(jd.java:1716)
    	at com.ibm.db2.jcc.c.fb.a(fb.java:200)
    	at com.ibm.db2.jcc.c.fb.b(fb.java:88)
    	at com.ibm.db2.jcc.c.s.b(s.java:60)
    	at com.ibm.db2.jcc.c.xb.d(xb.java:293)
    	at com.ibm.db2.jcc.b.jd.bb(jd.java:1709)
    	at com.ibm.db2.jcc.b.jd.eb(jd.java:1780)
    	at com.ibm.db2.jcc.b.jd.a(jd.java:2232)
    	at com.ibm.db2.jcc.b.jd.W(jd.java:537)
    	at com.ibm.db2.jcc.b.jd.executeUpdate(jd.java:520)
    	at com.ibm.ws.rsadapter.cci.WSResourceAdapterBase.pmiExecuteUpdate(WSResourceAdapterBase.java:715)
    	at com.ibm.ws.rsadapter.cci.WSResourceAdapterBase.executeUpdate(WSResourceAdapterBase.java:584)
    	at com.laOuJeBosse.leProjet.ejb.entity.websphere_deploy.DB2UDBNT_V8_1.FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.Create(FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.java:238)
    	at com.laOuJeBosse.leProjet.ejb.entity.websphere_deploy.DB2UDBNT_V8_1.FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.execute(FBL_COMPUT_ACFEE_FEES_FACTBeanFunctionSet_76811a3a.java:872)
    	at com.ibm.ws.rsadapter.cci.WSInteractionImpl.execute(WSInteractionImpl.java:538)
    	at com.ibm.ws.rsadapter.cci.WSRelationalRAAdapter.executeCreate(WSRelationalRAAdapter.java:375)
    	at com.ibm.ws.ejbpersistence.dataaccess.DataAccessRequestImpl.execute(DataAccessRequestImpl.java:191)
    	at com.ibm.ws.ejbpersistence.beanextensions.ConcreteBeanStatefulInstanceExtensionImpl.executeCreate(ConcreteBeanStatefulInstanceExtensionImpl.java:1999)
    	at com.ibm.ws.ejbpersistence.beanextensions.CBNotExistState.ejbCreate(CBNotExistState.java:38)
    	at com.ibm.ws.ejbpersistence.beanextensions.ConcreteBeanStatefulInstanceExtensionImpl.ejbPostCreate(ConcreteBeanStatefulInstanceExtensionImpl.java:331)
    	at com.laOuJeBosse.leProjet.ejb.entity.ConcreteFBL_COMPUT_ACFEE_FEES_FACT_76811a3a.ejbPostCreate(ConcreteFBL_COMPUT_ACFEE_FEES_FACT_76811a3a.java:145)
    	at com.laOuJeBosse.leProjet.ejb.entity.EJSCMPFBL_COMPUT_ACFEE_FEES_FACTHomeBean_76811a3a.create_Local(EJSCMPFBL_COMPUT_ACFEE_FEES_FACTHomeBean_76811a3a.java:30)
    	at com.laOuJeBosse.leProjet.ejb.entity.EJSLocalCMPFBL_COMPUT_ACFEE_FEES_FACTHome_76811a3a.create(EJSLocalCMPFBL_COMPUT_ACFEE_FEES_FACTHome_76811a3a.java:86)
    	at com.laOuJeBosse.leProjet.ejb.session.GestionCommissionBean.computeFeesOnAccount(GestionCommissionBean.java:131)
    	at com.laOuJeBosse.leProjet.ejb.session.EJSRemoteStatelessGestionCommission_411998cc.computeFeesOnAccount(EJSRemoteStatelessGestionCommission_411998cc.java:28)
    	at com.laOuJeBosse.leProjet.ejb.session._GestionCommission_Stub.computeFeesOnAccount(_GestionCommission_Stub.java:270)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    	at java.lang.reflect.Method.invoke(Method.java:611)
    	at org.quartz.jobs.ee.ejb.EJBInvokerJob.execute(EJBInvokerJob.java:226)
    	at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
    	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
    ---- Begin backtrace for Nested Throwables
    Voici un extrait de mon code:
    Interface home:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ...
    /**
             * Creates an instance from a key for Entity Bean:
             * FBL_COMPUT_ACFEE_FEES_FACT
             */
    	public com.laOuJeBosse.leProjet.ejb.entity.FBL_COMPUT_ACFEE_FEES_FACTLocal create(
    			java.lang.Long id) throws javax.ejb.CreateException;
     
    public com.laOuJeBosse.leProjet.ejb.entity.FBL_COMPUT_ACFEE_FEES_FACTLocal create(
    			String TICKET, Timestamp INSERT_TIME, String F_BPID, Long F_ACNO,
    			String F_ISIN, String F_GENDATE, String F_OTHRDATE, String F_NAME,
    			String F_TYPE, String BILLINGDATE, String UPLOADER,
    			String COMMITTER, Character REJECTED, String CAUSE,
    			String RANGE_TYPE, Integer RANGE_LEVEL, Integer RANGE_TOKEN,
    			Double FEE_AMOUNT, Character ALLFEES_LOADED, String ALLFEES_LOADER)
    			throws javax.ejb.CreateException;
    ...
    Mon bean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    ...
    /**
             * ejbCreate
             */
    	public java.lang.Long ejbCreate(java.lang.Long id)
    			throws javax.ejb.CreateException {
    		// setId(id); c'est ALWAYS GENERATED on a dit!
    		return null;
    	}
     
    	/**
             * ejbPostCreate
             */
    	public void ejbPostCreate(java.lang.Long id)
    			throws javax.ejb.CreateException {
    	}
     
    public void ejbPostCreate(String TICKET, Timestamp INSERT_TIME,
    			String F_BPID, Long F_ACNO, String F_ISIN, String F_GENDATE,
    			String F_OTHRDATE, String F_NAME, String F_TYPE,
    			String BILLINGDATE, String UPLOADER, String COMMITTER,
    			Character REJECTED, String CAUSE, String RANGE_TYPE,
    			Integer RANGE_LEVEL, Integer RANGE_TOKEN, Double FEE_AMOUNT,
    			Character ALLFEES_LOADED, String ALLFEES_LOADER)
    			throws javax.ejb.CreateException {
    	}
     
    	public java.lang.Long ejbCreate(String TICKET, Timestamp INSERT_TIME,
    			String F_BPID, Long F_ACNO, String F_ISIN, String F_GENDATE,
    			String F_OTHRDATE, String F_NAME, String F_TYPE,
    			String BILLINGDATE, String UPLOADER, String COMMITTER,
    			Character REJECTED, String CAUSE, String RANGE_TYPE,
    			Integer RANGE_LEVEL, Integer RANGE_TOKEN, Double FEE_AMOUNT,
    			Character ALLFEES_LOADED, String ALLFEES_LOADER)
    			throws javax.ejb.CreateException {
    		setTicket(TICKET);
    		setInsert_time(INSERT_TIME);
    		setF_bpid(F_BPID);
    		setF_acno(F_ACNO);
    		setF_isin(F_ISIN);
    		setF_gendate(F_GENDATE);
    		setF_othrdate(F_OTHRDATE);
    		setF_name(F_NAME);
    		setF_type(F_TYPE);
    		setBillingdate(BILLINGDATE);
    		setUploader(UPLOADER);
    		setCommitter(COMMITTER);
    		setRejected(REJECTED);
    		setCause(CAUSE);
    		setRange_type(RANGE_TYPE);
    		setRange_level(RANGE_LEVEL);
    		setRange_token(RANGE_TOKEN);
    		setFee_amount(FEE_AMOUNT);
    		setAllfees_loaded(ALLFEES_LOADED);
    		setAllfees_loader(ALLFEES_LOADER);
    		return null;
    ...
    Je sais que cette version des ejb est pour le moins très "lourde", j’espère seulement trouver quelqu'un qui puisse m'aider.
    Merci pour toutes vos contributions.

  2. #2
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Personne ne connait assez cette techno? Je pourrais changer la définition de la clé de la table et opter pour une séquence mais je laisse ça en dernier recours. Il doit y avoir une solution plus conventionnelle.

  3. #3
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    J'ai trouvé que des serveurs tels que WebLogic ou encore JBoss offrent la possibilité de générer une clé quand celle ci est "identity" pour la création d'enregistrement par configuration et non programmation très facilement comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    WebLogic:
     
     
     
                MSSQL:
     
                                        <automatic-key-generation>
     
                                                    <generator-type>SQLServer</generator-type>
     
                                        </automatic-key-generation>
     
                Oracle:
     
                                         <generator-type>ORACLE</generator-type>
     
                                                     <generator-name>MYTABLE_ID_SEQ</generator-name>
     
                                                    <key-cache-size>1</key-cache-size>
     
                                        </automatic-key-generation>
     
     
     
    JBoss:
     
     
     
                MSSQL:
     
     
     
                            <entity-command name="mssql-fetch-key"/>
     
     
     
                Oracle:
     
                            <entity-command name="oracle-sequence">
     
                                <attribute name="sequence">MYTABLE_ID_SEQ</attribute>
     
                            </entity-command>
    L'appli est déployée sur un websphere 8 en ce qui me concerne. Est-ce qu'il existe un mécanisme similaire sur WAS 8 pour DB2?

  4. #4
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Bon j'ai fini par opter pour un BMP pour ramener la next value d'une séquence avec laquelle j'alimente la clé primaire pour un nouvel enregistrement.
    Je m'étonne juste de ne pas avoir eu une seul réponse depuis maintenant près d'une semaine ? Je n'ai peut être pas bien exposé mon problème. Merci tout de même, je laisse le post encore ouvert, des fois que quelqu'un trouve des réponses à mes questions.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/07/2008, 19h09

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