Avatar billede thomaz Nybegynder
13. marts 2002 - 14:43 Der er 21 kommentarer

create() i homeinterfacet

er det muligt at have en create() metode i home interfacet, der ikke har ind parametre. Grunden til at jeg har behov for dette er, at jeg skal skal have en oprettet en instans af EJBHome så jeg kan kalde metoder på min bønne. Bruge CMP. Når jeg gør dette kan jeg ikke indsætte i databasen. Skal jeg virkelig have create(ind parametre) med indparametre. ?? mit home interface ser sådan ud:
public interface ConsultHome extends EJBHome
{
  public Consult create() throws RemoteException, CreateException;
  public Consult create(int id, Timestamp date, Integer amount, Integer typeid, Integer projectid, String description, Integer locked, Integer lockedid, String dayid, String user, String interndescription, Timestamp lastupdate, Integer state) throws CreateException, RemoteException;
  public Consult create(int id) throws RemoteException, CreateException;
  public Consult findByPrimaryKey(int primaryKey) throws RemoteException, FinderException;
  public Collection findAll() throws RemoteException, FinderException;
}
Avatar billede kama Nybegynder
13. marts 2002 - 14:55 #1
Jeg har meget svært ved at forstå hvad du mener!
Man får en instans af EJBHome ved at lave en lookup.
På denne instans kan man så kalde create eller finder-metoder.
Med CMP danner du jo et persistent object ved kald af create().
Create() skal som minimum definere en primær-nøgle enten som parameter eller i implementeringen af create()-metoden.
Avatar billede thomaz Nybegynder
13. marts 2002 - 15:16 #2
hmm prøver lige at forklare hvad jeg mener. Har en database der allerede har data. Vil gerne indsætte data via min set metoder. Det første jeg gør er:

KLIENTEN:

Object ref2 = ctx.lookup("Consult2");
consultHome  = (ConsultHome) PortableRemoteObject.narrow(ref2, ConsultHome.class);

Har nu fat i mit home interface. Vil nu gerne kalde metoder f.eks.:(hvor jeg opdaterer min database)

Min Bønne:

public Integer amount;
public void setAmount(Integer amount)
{
    this.amount = amount;
}
har prøvet med:

KLIETEN:

public void setAllTimeregistrering()
  {
    try
    {
      Userlookup();
      Consult consult = (Consult) PortableRemoteObject.narrow(consultHome, Consult.class);
      //Consult consult = consultHome.create();

    }
      catch(Exception e)
    {
      e.printStackTrace();
    }

    if (consult == null)
    {
      System.out.println("Error in setAllTimeregistrering()" );
      return ;
    }
    try
    {
      //setAmount()
      consult.setTypeid(typeselect);
      consult.setProjectid( projektselect);
      consult.setDescription(beskrivelse_text);
      // setlocked()
      consult.setLockedid(stedselect);
      //setDayID()
      // setUser()
      consult.setInterndescription(intern_beskrivelse);
      //setLastupdate()
      // setstate()

    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
Jeg ved godt at jeg danner er persistene møsnter ved create(), men jeg ønsker ikke at indsætte data via min create() metode men derimod min set metoder
Avatar billede kama Nybegynder
13. marts 2002 - 15:36 #3
Jeg er stadig forvirret - bruger du CMP, BMP eller begge dele????
Bruger du CMP, så glem alt om den reelle database! Du arbejder jo med et abstrakt database-skema, hvor du via din descriptor angiver finder-kald vha. QL.
1) Lav et lookup til Home.
2) Find de konkrete instanser du skal bruge vha. en finder eller én konkret instans vha. findByPrimaryKey(id).
3) Du kan nu kalde business-metoder via en remote-reference.

Du er nødt til at finde det object, der skal opdateres først! Du kan ikke opdatere en instans via Home-interfacet.
Avatar billede thomaz Nybegynder
13. marts 2002 - 15:45 #4
jeg bruger kun CMP ver 1.1 og ikke BMP. Ok jeg skal lave en finder ok. Så hvis jeg vil have opdateret en række i databasen kan jeg bruge findbyprimarykey eller findAll() ok prøver det lige
Avatar billede kama Nybegynder
13. marts 2002 - 16:00 #5
Hvad nu hvis det var en ren objekt-orienteret database, der var installeret i containeren - vil du så også kalde det en række i databasen? Glem den database! :-))
Avatar billede thomaz Nybegynder
13. marts 2002 - 16:47 #6
Ok kan se iden. Har gjort følgende:
Får ingen fejl men får heller ikke opdateret DB. Hvad er det jeg mangler ?

public void setAllTimeregistrering()
  {
        Collection returnValue = null;
        try
        {
          Userlookup();// metode i superklasser der laver lookup og får en reference til consultHome interfacet

          returnValue = consultHome.findAll();
          Iterator iterator = returnValue.iterator();

          while (iterator.hasNext())
          {
            Object object = iterator.next();
            Consult consult = (Consult) PortableRemoteObject.narrow(object, Consult.class);
            consult.setTypeid(typeselect);
            consult.setProjectid(projektselect);
            consult.setDescription(beskrivelse_text);
            consult.setLockedid(stedselect);
            consult.setInterndescription(intern_beskrivelse);

          }

        }
      catch(Exception e)
      {
      System.out.println("fejl"+e);
      }
Avatar billede kama Nybegynder
13. marts 2002 - 17:20 #7
1) Får du noget i din Collection?
2) Har du angivet attributterne som persistente i descriptor?
3) Har du anivet de rigtige transaktions-indstillinger på metoderne?

Prøv at undersøge ovenstående først. Håber det hjælper lidt.
Avatar billede thomaz Nybegynder
13. marts 2002 - 17:41 #8
Får dette her retur når jeg udskriver Collectionen. Det ser ud til at min Collection er tom ??. Hvorfor kan jeg ikke rigig se ?

[Stub[repository_id=RMI:timeregistrering.Consult:0000000000000000,key=ServiceId[service=/EJB[myserver\/ejbcontainer]Consult2,id={4 bytes: (2)(0)(0)(0)}],codebase=null]] null
Avatar billede kama Nybegynder
13. marts 2002 - 17:50 #9
Hvordan ser din QL ud til findall()?
select object(c) from Consult c ?
Avatar billede thomaz Nybegynder
13. marts 2002 - 17:55 #10
Ok prøvede lige med at lave en en getMetoder på min Collection og returnerede værdien. Det virkede. Så min Collection må indeholde noget
Avatar billede thomaz Nybegynder
13. marts 2002 - 17:57 #11
min findall() QL må være ok da jeg har testet med en getMetode der fungerede på min Collection. Kan man ikke ullede det ud af det ??
Avatar billede thomaz Nybegynder
13. marts 2002 - 18:20 #12
hvordan finder jeg ud af at tjekker min attributter i dd. ?
Avatar billede kama Nybegynder
13. marts 2002 - 18:36 #13
Persistens:
<cmp-field>
<description>blabla</description>
<field-name>typeId</field-name>
</cmp-field>

QL:
<query>
<description></description>
<query-method>
<method-name>findAll</method-name>
<method-params />
</query-method>
<ejb-ql>select object(c) from Consult c</ejb-ql>
</query>

Transaktion:
<container-transaction>
<method>
<ejb-name>ConsultEJB</ejb-name>
<method-intf>Remote</method-intf>
<method-name>getTypeId</method-name>
<method-params />
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
Avatar billede kama Nybegynder
13. marts 2002 - 18:38 #14
Jeg forstod ikke det med, at du kaldte en getMetode på din Collection og returnerede værdien. Jeg går ud fra, at det var en skrivefejl. Du kunne altså godt kalde get-metoden på alle dine Consult-objekter, som hver især returnerede deres værdi?
Avatar billede thomaz Nybegynder
14. marts 2002 - 11:41 #15
ok kama, af en eller anden grund virker det nu med at jeg kan indsætte i databasen. MEN Når jeg indsætter opdateres samtlige rækker i min database. De værdier der kun skulle indsættes i en række bliver nu indsat i samtlig rækker i min database. Det er den samme kode jeg har postet jeg bruger. Kan du gennemskue det ??
Avatar billede kama Nybegynder
14. marts 2002 - 11:51 #16
Ja, du opdaterer jo alle objekterne.
Du har et loop der gennemløber en Collection med alle dine Consult-objekter, som du sætter attributter på.
Avatar billede thomaz Nybegynder
14. marts 2002 - 12:51 #17
Hvordan udgår jeg så dette. Skulle jo gerne have en reference til Remote og skulle jo gerne indsætte i databasen ikke overskrive alle min rækker i databasen. Hver gang jeg kalder setAllTimeregistrering() skulle jeg gerne indsætte i en ny række i databasen. Men kan ikke lige se hvordan jeg gør
Avatar billede kama Nybegynder
14. marts 2002 - 13:07 #18
Du vil bare ikke høre efter, hva'? :-))
Du benytter create() til at danne en instans!
Nu kender jeg ikke logikken i dit system, men hvis du arbejder OO så er det jo lige ud ad landevejen. Det virker lidt som om, at du vil skabe persistens på nogle relationer. Hvis dette er tilfældet så er løsningen jo CMR - så sker det helt automatisk.
Avatar billede logical Nybegynder
17. april 2002 - 22:15 #19
Du kan godt have en blank create metode i din CMP ejb, du har bare ansvaret for at bønnen har en unik instans af din primære nøgle for din CMP ejb, f.eks.

public Integer ejbCreate() throws CreateException {
  this.key = SomeMechanismForSelectingKeys.getNext();
  return null;
}
Avatar billede r9 Nybegynder
07. maj 2002 - 16:26 #20
er det ikke tid til at lukke?
Avatar billede snuseren.dk Nybegynder
08. maj 2003 - 17:40 #21
lukketid (?)
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