Avatar billede aslan Nybegynder
01. februar 2004 - 21:02 Der er 10 kommentarer og
1 løsning

Skelne mellem Session bean og Entity bean?

Jeg startede med at lave en Entity bean og nu har jeg lavet en Session bean og nu sidder jeg og overvejer hvori fordelen er ved at bruge 2 forskellige beans?

Jeg mener teorien siger at man laver sin forretnings logik i Session beans(funktions lag) og db jobs(model lag) i Entity beans. Men jeg vil sagtens kunne lave db forespørgsler fra en Session beans og implementere logik i Entity beans. Hvad er det lige præcist der gør disse beans forskellige?

En anden tanke jeg har haft er at hvis jeg nu skal have en arkitektur som:

app----session----entity----db

Er det så meningen jeg skal kalde entity beans remote fra session bean, og kan det være forkert at kalde db direkte fra session bean?
Avatar billede billen Nybegynder
01. februar 2004 - 21:06 #1
Hvis session og entity bean befinder sig på samme maskine i samme J2EE server, så skal du hellere bruge local kald fra din session bean til din entity bean.

Man kan bruge local kald når der kaldes fra samme JVM.
Avatar billede arne_v Ekspert
01. februar 2004 - 21:16 #2
Lidt forsimplet:

session bean = komponent som leverer en service (meget kode lidt data)
entity bean = komponent som repræsenterer en record i en tabel (lidt kode meget data)

begge kan sådan set indeholde forretnings logik men de opererer på forskellige
niveauer.

Man kan godt lave database operationer i en session bean og typisk vil man
også gøre det hvis det ikke er enkelt record orienteret.

Bemærk at session beans er til synkrone kald mens message driven beans har samme
rolle for asynkrone kald.

local call er meget hurtigere end remote call

Det er idag accepteret best practice at have en session facade med remote
og local interface og entity beans med kun local interface.
Avatar billede aslan Nybegynder
01. februar 2004 - 21:50 #3
Vi diskutere dit svar arne, vender tilbage til dig...
Avatar billede arne_v Ekspert
01. februar 2004 - 22:04 #4
Med hensyn til facade, så prøv f.eks. at læs:
  http://www.eksperten.dk/spm/408644
Avatar billede arne_v Ekspert
01. februar 2004 - 22:06 #5
Med hensyn til ikke entity bean egnede operationer så overvej hvordan man
laver en summering af alle værdier i et felt med entity beans.
Avatar billede aslan Nybegynder
04. februar 2004 - 19:05 #6
Tak for det arne..
Avatar billede arne_v Ekspert
04. februar 2004 - 19:14 #7
Har I nogle gode bøger om emnet ?

Det er næsten nødvendigt med et emne så komplekst som J2EE !
Avatar billede billen Nybegynder
04. februar 2004 - 19:48 #8
Vi har haft en del bøger, men jeg er selv specielt glad for "EJB for dummies". Det er en virkelig god opslagsbog til EJB.

Jeg skal også til at kigge på J2EE in 21 days. Men den virker ikke så god...
Avatar billede arne_v Ekspert
04. februar 2004 - 19:58 #9
Har I kigget på:
  Mastering Enterprise JavaBeans / Ed Roman + 2 mere
?

Jeg synes at den er rimelig god til at forklare tingene.

En ikke-printbar version kan downloades her:
  http://www.theserverside.com/books/wiley/masteringEJB/index.jsp
Avatar billede aslan Nybegynder
05. februar 2004 - 14:08 #10
Hej arne vi sidder lige med en fejl vi ikke kan komme videre med. Når vi deployer får vi denne fejl:

Depends On Me: org.jboss.deployment.DeploymentException: Error while fixing table name; - nested throwable: (org.jboss.util.NestedSQLException: Could not create connection; - nested throwable: (java.sql.SQLException: Unable to connect to any hosts due to exception: java.net.ConnectException: Connection refused); - nested throwable: (org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: Unable to connect to any hosts due to exception: java.net.ConnectException: Connection refused)))]
13:57:34,177 WARN  [JBossManagedConnectionPool] Unable to fill pool
org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: Unable to connect to any hosts due to exception: java.net.ConnectException: Connection refused)


Vi har brugt XDoclets til at lave vores beans ud fra dit eksempel i din artikel. Et eksempel på en bean vi har defineret:

package dk.faem.j2ee.beans.cmp;

import javax.ejb.*;

/**
* GenreBean.
*
* @ejb.bean
* name="Genre"
* type="CMP"
* cmp-version="2.x"
* local-jndi-name="ejb/entity/Genre"
* primkey-field="id"
*
* @ejb.finder
* signature="java.util.Collection findAll()"
*
* @ejb.persistence
* table-name="genre"
*
* @jboss.persistence
* datasource="java:/OpenBroadDB"
* datasource-mapping="SOLID"
*/
abstract public class GenreBean implements EntityBean {
    private EntityContext entityContext;
    public Integer ejbCreate(Integer id, String name ) throws CreateException {
        setId(id);
        setName(name);
       
        return null;
    }
    public void ejbPostCreate(Integer id, String name) throws CreateException {
    }
    public void ejbRemove() throws RemoveException {
    }
    public void ejbLoad() {
    }
    public void ejbStore() {
    }
    public void ejbActivate() {
    }
    public void ejbPassivate() {
    }
    public void unsetEntityContext() {
        this.entityContext = null;
    }
    public void setEntityContext(EntityContext entityContext) {
        this.entityContext = entityContext;
    }
    /**
    * @ejb.persistence
    * column-name = "id"
    *
    * @ejb.pk-field
    *
    * @ejb.interface-method
    * view-type="local"
    */
    public abstract Integer getId();
    /**
    * @ejb.interface-method
    * view-type="local"
    */
    public abstract void setId(Integer id);
    /**
    * @ejb.persistence
    * column-name = "name"
    *
    * @ejb.interface-method
    * view-type="local"
    */
    public abstract String getName();
    /**
    * @ejb.interface-method
    * view-type="local"
    */
    public abstract void setName(String name);


Og vores DB descriptor:

<?xml version="1.0" ?>

<datasources>
  <local-tx-datasource>
    <jndi-name>OpenBroadDB</jndi-name>
    <connection-url>jdbc:mysql://localhost/faem</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>openbroad</user-name>
    <password>openbroad</password>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>100</max-pool-size>
  </local-tx-datasource>
</datasources>
Avatar billede aslan Nybegynder
05. februar 2004 - 14:20 #11
Vi har fundet fejlen..
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