Avatar billede casualty Nybegynder
18. november 2003 - 21:08 Der er 30 kommentarer og
1 løsning

findByPrimaryKey i CMP EJB

Jeg har oprettet en sessionbean ud fra en tabel i min database men tabellen har en sammensat primærnøgle. Hvordan skal jeg håndtere det?

Jeg bruger Oracles jdeveloper til at modellere hvilket er et glimrende værktøj, jeg kan bare hive mine tabeller ind i programmet og den skriver selv bønnerne + xml filerne, det negative er dog at man bliver lidt kodefjern, men til gengæld sparer man tid.

Mvh Casualty
Avatar billede casualty Nybegynder
18. november 2003 - 21:12 #1
Spørgsmålet går ikke på hvordan man gør det i jDeveloper men derimod om der er noget man skal tage højde for når man har sammensatte primærnøgler?
Avatar billede arne_v Ekspert
18. november 2003 - 21:36 #2
Med en sammensat primær nøgle skal du lave din egen Primary Key klasse.
Avatar billede arne_v Ekspert
18. november 2003 - 22:03 #3
Du laver klassen og erklærer den som primary key class i deployment
descriptor.

Members skal alle være CMP fields og er databasens primær nøgle.

findByPrimaryKey tager naturligvsi et argument af denne type.

Jeg kan ikke umiddelbart komme i tanke om noget specielt.

Jeg har ikke prøvet EJB i JDeveloper, men jeg vile da tro, at den kunne
generere kode & deployment descriptor for det også.
Avatar billede casualty Nybegynder
18. november 2003 - 22:05 #4
Ok jeg prøver at kigge på det :)
Avatar billede casualty Nybegynder
19. november 2003 - 21:29 #5
Kan du komme med et eksempel på hvorledes denne klasse skal se ud?

jeg har lavet en test og har følgende tabeller:

medarbejder
  pk: medarbejdernr
  medarbejdernavn

afdeling
  pk: afdelingsnr
  afdelingsnavn

medarbejderafdeling
  pk/fk: afdelingsnr
  pk/fk: medarbejdernr

Dette skal jeg lave som en klasse hvordan?

Mener du at jeg skal henvise til denne klasse i XML således:
<prim-key-class>minklasse</prim-key-class>
Avatar billede casualty Nybegynder
19. november 2003 - 21:33 #6
Jeg ser faktisk at mit udviklingsværktøj har udviklet dette:
<prim-key-class>mypackage3.MedarbejderafdelingPK</prim-key-class>

Og denne klasse:
package mypackage3;
import java.io.Serializable;

public class MedarbejderafdelingPK implements Serializable
{
  public Long medarbejdernr;
  public Long afdelingsnr;

  public MedarbejderafdelingPK()
  {
  }

  public MedarbejderafdelingPK(Long afdelingsnr, Long medarbejdernr)
  {
    this.afdelingsnr = afdelingsnr;
    this.medarbejdernr = medarbejdernr;
  }

  public boolean equals(Object other)
  {
    if (other instanceof MedarbejderafdelingPK)
    {
      final MedarbejderafdelingPK otherMedarbejderafdelingPK = (MedarbejderafdelingPK)other;

      // The following assignment statement is auto-maintained and may be overwritten!
      boolean areEqual = (otherMedarbejderafdelingPK.afdelingsnr.equals(afdelingsnr) && otherMedarbejderafdelingPK.medarbejdernr.equals(medarbejdernr));

      return areEqual;
    }

    return false;
  }

  public int hashCode()
  {
    // Add custom hashCode() impl here
    return super.hashCode();
  }
}


Men jeg får bare en nullpointer exception.
Avatar billede casualty Nybegynder
19. november 2003 - 21:35 #7
Fejlmedd.:

Auto-deploying file:/C:/Documents and Settings/Administrator/Desktop/skolekode/sammmensat/classes/ (No previous deployment found)... java.lang.NullPointerException

    void com.evermind.server.ejb.compilation.CMPObjectCompilation.processContainerManagedField(com.evermind.server.ejb.deployment.ContainerManagedField, com.evermind.util.ByteString, boolean)

        CMPObjectCompilation.java:314
Avatar billede arne_v Ekspert
19. november 2003 - 21:37 #8
Den PK klasse ser OK ud.
Avatar billede casualty Nybegynder
19. november 2003 - 21:38 #9
Men kan du se hvad fejlen skulle være?
Avatar billede arne_v Ekspert
19. november 2003 - 21:39 #10
Der er en eller anden lille obskuritet.

Vi skal have dne fulde fejl tekst.

Hvilken server bruger du ?
Avatar billede casualty Nybegynder
19. november 2003 - 21:41 #11
Jeg bruger oracles OC4J... Her er den fulde fejlmedd:

Copying default deployment descriptor from archive at C:\Documents and Settings\Administrator\Desktop\skolekode\sammmensat\classes/META-INF/orion-ejb-jar.xml to deployment directory D:\Local\Java\jdev903\jdev\system9.0.3.2.1145\oc4j-config\application-deployments\current-workspace-app\classes...

Auto-deploying file:/C:/Documents and Settings/Administrator/Desktop/skolekode/sammmensat/classes/ (No previous deployment found)... java.lang.NullPointerException

    void com.evermind.server.ejb.compilation.CMPObjectCompilation.processContainerManagedField(com.evermind.server.ejb.deployment.ContainerManagedField, com.evermind.util.ByteString, boolean)

        CMPObjectCompilation.java:314

    void com.evermind.server.ejb.compilation.CMPObjectCompilation.processFields()

        CMPObjectCompilation.java:235

    void com.evermind.server.ejb.compilation.PersistenceManagerCompilation.compile()

        PersistenceManagerCompilation.java:59

    void com.evermind.server.ejb.compilation.EntityBeanCompilation.compile()

        EntityBeanCompilation.java:332

    void com.evermind.server.ejb.compilation.Compilation.compile()

        Compilation.java:288

    void com.evermind.server.ejb.EJBContainer.postInit(com.evermind.server.ejb.EJBContainerConfig, com.evermind.server.administration.ApplicationInstallation)

        EJBContainer.java:551

    void com.evermind.server.Application.postInit(com.evermind.server.ApplicationConfig, com.evermind.server.administration.ApplicationInstallation)

        Application.java:431

    void com.evermind.server.Application.setConfig(com.evermind.server.ApplicationConfig, com.evermind.server.administration.ApplicationInstallation)

        Application.java:136

    void com.evermind.server.Application.setConfig(com.evermind.server.ApplicationConfig)

        Application.java:115

    void com.evermind.server.ApplicationServer.doCheckForUpdates()

        ApplicationServer.java:2431

    void com.evermind.server.ApplicationServer.checkForUpdates()

        ApplicationServer.java:2262

    void com.evermind.server.ApplicationServerTask.run()

        ApplicationServerTask.java:45

    void com.evermind.util.TaskManager.run()

        TaskManager.java:181

    void EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run()

        PooledExecutor.java:797

    void java.lang.Thread.run()

        Thread.java:484
Avatar billede arne_v Ekspert
19. november 2003 - 22:06 #12
Suk.

Det er som at fange en sort kat i et mørkt lokale med bind for
øjnene.
Avatar billede arne_v Ekspert
19. november 2003 - 22:06 #13
Hvordan ser ejb-jar.xml og orion-ejb-jar.xml ud for den bønne ?
Avatar billede casualty Nybegynder
19. november 2003 - 22:09 #14
ejb-jar.xml:

<entity>
      <description>Entity Bean ( CMP )</description>
      <display-name>Medarbejderafdeling</display-name>
      <ejb-name>Medarbejderafdeling</ejb-name>
      <local-home>mypackage3.MedarbejderafdelingLocalHome</local-home>
      <local>mypackage3.MedarbejderafdelingLocal</local>
      <ejb-class>mypackage3.impl.MedarbejderafdelingBean</ejb-class>
      <persistence-type>Container</persistence-type>
      <prim-key-class>mypackage3.MedarbejderafdelingPK</prim-key-class>
      <reentrant>False</reentrant>
      <cmp-version>2.x</cmp-version>
      <abstract-schema-name>Medarbejderafdeling</abstract-schema-name>
    </entity>

HELE orion-ejb-jar.xml:
<?xml version = '1.0' encoding = 'windows-1252'?>
<!DOCTYPE orion-ejb-jar PUBLIC "-//Evermind//DTD Enterprise JavaBeans 1.1 runtime//EN" "http://xmlns.oracle.com/ias/dtds/orion-ejb-jar.dtd">
<orion-ejb-jar>
  <enterprise-beans>
    <session-deployment max-instances="-1" name="MySessionEJB"/>
    <entity-deployment max-instances="-1" name="Afdeling" data-source="jdbc/delfi2DS" table="AFDELING">
      <primkey-mapping>
        <cmp-field-mapping name="afdelingsnr" persistence-name="AFDELINGSNR" persistence-type="NUMBER(5)"/>
      </primkey-mapping>
      <cmp-field-mapping name="afdelingsnr" persistence-name="AFDELINGSNR" persistence-type="NUMBER(5)"/>
      <cmp-field-mapping name="afdelingsnavnnavn" persistence-name="AFDELINGSNAVNNAVN" persistence-type="VARCHAR2(20)"/>
      <cmp-field-mapping name="medarbejderafdeling_afdelingsnr">
        <collection-mapping table="MEDARBEJDERAFDELING">
          <primkey-mapping>
            <cmp-field-mapping>
              <entity-ref home="Afdeling">
                <cmp-field-mapping persistence-name="AFDELINGSNR" persistence-type="NUMBER(5)"/>
              </entity-ref>
            </cmp-field-mapping>
          </primkey-mapping>
          <value-mapping type="mypackage3.MedarbejderafdelingLocal">
            <cmp-field-mapping>
              <entity-ref home="Medarbejderafdeling">
                <cmp-field-mapping>
                  <fields>
                    <cmp-field-mapping name="medarbejdernr" persistence-name="MEDARBEJDERNR" persistence-type="NUMBER(5)"/>
                    <cmp-field-mapping name="afdelingsnr" persistence-name="AFDELINGSNR" persistence-type="NUMBER(5)"/>
                  </fields>
                </cmp-field-mapping>
              </entity-ref>
            </cmp-field-mapping>
          </value-mapping>
        </collection-mapping>
      </cmp-field-mapping>
    </entity-deployment>
    <entity-deployment max-instances="-1" name="Medarbejder" data-source="jdbc/delfi2DS" table="MEDARBEJDER">
      <primkey-mapping>
        <cmp-field-mapping name="medarbejdernr" persistence-name="MEDARBEJDERNR" persistence-type="NUMBER(5)"/>
      </primkey-mapping>
      <cmp-field-mapping name="medarbejdernr" persistence-name="MEDARBEJDERNR" persistence-type="NUMBER(5)"/>
      <cmp-field-mapping name="medarbejdernavn" persistence-name="MEDARBEJDERNAVN" persistence-type="VARCHAR2(20)"/>
      <cmp-field-mapping name="medarbejderafdeling_medarbejdernr">
        <collection-mapping table="MEDARBEJDERAFDELING">
          <primkey-mapping>
            <cmp-field-mapping>
              <entity-ref home="Medarbejder">
                <cmp-field-mapping persistence-name="MEDARBEJDERNR" persistence-type="NUMBER(5)"/>
              </entity-ref>
            </cmp-field-mapping>
          </primkey-mapping>
          <value-mapping type="mypackage3.MedarbejderafdelingLocal">
            <cmp-field-mapping>
              <entity-ref home="Medarbejderafdeling">
                <cmp-field-mapping>
                  <fields>
                    <cmp-field-mapping name="medarbejdernr" persistence-name="MEDARBEJDERNR" persistence-type="NUMBER(5)"/>
                    <cmp-field-mapping name="afdelingsnr" persistence-name="AFDELINGSNR" persistence-type="NUMBER(5)"/>
                  </fields>
                </cmp-field-mapping>
              </entity-ref>
            </cmp-field-mapping>
          </value-mapping>
        </collection-mapping>
      </cmp-field-mapping>
    </entity-deployment>
    <entity-deployment max-instances="-1" name="Medarbejderafdeling" data-source="jdbc/delfi2DS" table="MEDARBEJDERAFDELING">
      <primkey-mapping>
        <cmp-field-mapping>
          <fields>
            <cmp-field-mapping name="medarbejdernr" persistence-name="MEDARBEJDERNR" persistence-type="NUMBER(5)"/>
            <cmp-field-mapping name="afdelingsnr" persistence-name="AFDELINGSNR" persistence-type="NUMBER(5)"/>
          </fields>
        </cmp-field-mapping>
      </primkey-mapping>
      <cmp-field-mapping name="afdeling_afdelingsnr" persistence-name="AFDELINGSNR">
        <entity-ref home="Afdeling">
          <cmp-field-mapping persistence-name="AFDELINGSNR" persistence-type="NUMBER(5)"/>
        </entity-ref>
      </cmp-field-mapping>
      <cmp-field-mapping name="medarbejder_medarbejdernr" persistence-name="MEDARBEJDERNR">
        <entity-ref home="Medarbejder">
          <cmp-field-mapping persistence-name="MEDARBEJDERNR" persistence-type="NUMBER(5)"/>
        </entity-ref>
      </cmp-field-mapping>
    </entity-deployment>
  </enterprise-beans>
  <assembly-descriptor>
    <default-method-access>
      <security-role-mapping impliesAll="true" name="&lt;default-ejb-caller-role>"/>
    </default-method-access>
  </assembly-descriptor>
</orion-ejb-jar>
Avatar billede arne_v Ekspert
19. november 2003 - 22:40 #15
Forudsat at tabellen har de 2 felter MEDARBEJDERNR og AFDELINGSNR, så er
det eneste der undrer mig at NUMBER(5) mappes til Long.
Avatar billede casualty Nybegynder
19. november 2003 - 22:44 #16
Ja jeg ved ikke hvorfor at JDeveloper gør det me det må være noget med at den ikke kan mappe til et en int da denne er primitiv??? et gæt...

Anyway Så virker det fint hvis jeg laver tabellen med et ekstra felt som er en primærnøgle:

medarbejderafdeling
  pk: medarbejderafdelingsnr
  fk: afdelingsnr
  fk: medarbejdernr

Men det havde jo bare været rart om det andet havde virket...
Avatar billede casualty Nybegynder
19. november 2003 - 22:45 #17
Også selvom den mapper til Long... Det har jeg undret mig over, men lært bare at leve med :)
Avatar billede arne_v Ekspert
19. november 2003 - 22:48 #18
Det andet *skal* virke.

Det bruges meget.

Så selvfølgelig kan OC4J også gøre det.

Kan du ikke finde noget i docs ?
Avatar billede casualty Nybegynder
19. november 2003 - 22:53 #19
Det mærkelige er jo at JDeveloper er et kanont(synes jeg) værtøj til at modellere EJB´er i. Den den er bundlet med OC4J således at man kan teste undervejs i udviklingen på en let måde, og deployer selv. Underligt at den så lige laver en sådan fejl når den nu selv finder ud af at der er en sammensat primærnøgle og selv skriver PK-klassen + XML osv.

...docs?
Avatar billede arne_v Ekspert
19. november 2003 - 23:07 #20
Der må være nogen online docs enten med JDeveloper eller med 9iAS/OC4J eller
med Orion.
Avatar billede arne_v Ekspert
19. november 2003 - 23:11 #21
Avatar billede arne_v Ekspert
19. november 2003 - 23:12 #22
Jeg kunne også selv prøve at genskabe problemet, men det er en lidt
halvstor affære, som nok kræver en weekend.
Avatar billede casualty Nybegynder
19. november 2003 - 23:20 #23
Ja det behøver du ikke, så mange points har jeg helller ikke :)

Jeg prøver at se om jeg kan læse mig frem til det og eventuelt spørge vores vejledere på skolen om de er bekendte med problemet... Jeg skal nok vende tilbage når/hvis jeg finder en løsning..
Avatar billede arne_v Ekspert
19. november 2003 - 23:26 #24
Nu er det ikke pointene der er afgørende.

Det er jo et interessant problem.

Men tid er en begrænset ressource.

Hvis du ikke har en løsning på lørdag og hvis konen ikke beordrer mig
til have arbejde, så vil måske prøve at lege lidt.
Avatar billede casualty Nybegynder
21. november 2003 - 00:29 #25
jeg tror nok at de har lovet regn, så hvis du får tid skal du være mere end velkommen. Jeg er ikke selv kommet nærmere et svar.
jeg har lagt filerne ud her: http://bluepage.dk/eksperten/sammensat.zip

Mvh Casualty
Avatar billede arne_v Ekspert
30. november 2003 - 23:40 #26
Jeg har ikke glemt dig. Men der har været så meget andet.

Og så driller JDeveloper lidt.

Hvor definerer man jdbc/delfi2DS henne for den indbyggede OC4J ?
Avatar billede casualty Nybegynder
01. december 2003 - 16:58 #27
I din Systemnavigator er der et punkt der hedder connections/database..

Der vælger du ny...Jeg har sendt connection info til arne@vajhoej.dk
Avatar billede arne_v Ekspert
01. december 2003 - 21:26 #28
Den har jeg fundet, men jeg skrev kun delfi2DS der.

Skal man skrive jdbc/delfi2DS ?
Avatar billede casualty Nybegynder
01. december 2003 - 21:38 #29
Du skal kun kalde den "delfi2" JDeveloper tilføjer selv "ds"...
Avatar billede casualty Nybegynder
11. februar 2004 - 00:20 #30
Hej arne... Lægger du ikke et svar således at vi kan få afsluttet denne tråd...?
Avatar billede arne_v Ekspert
11. februar 2004 - 08:10 #31
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester