Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > EntityBean ---> SessionBean


Автор: Unlimited 21.8.2007, 01:08
Привет Всем!!!
У меня есть EntityBean  „PersonEJB“   в котором реализуется максимальный „Primary Key“ (определяется MAX  и потом дабавляется  1) из таблицы PeronEJBTable. Т.к. эта функция для других EJBs необходима, нужно реализовать эту фукцию в ststeless SessionBean (HandlerEJB)  и соответственно вызов в PersonEJB  этой функции. Т.е. убрать функцию
 private Integer maxPrimaryKey(String idName, String tabellenName)
из PersonEJB  и реализовать  в HandlerEJB(SessionBean) .
Подскажите пожалуйста как это реализовать, желательно с примерами для наглядности.

cod EntityBean см. ниже

Заранее спасибо!!!!


PersonEJB

Код

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public abstract class PersonEJB implements EntityBean {

    Connection conn;

    PreparedStatement prepStmt;

    ResultSet result;

    public PersonEJB() {
    }

    // die abstakten Zugriffsmethoden
    public abstract Integer getPersonID();

    public abstract String getName();

    public abstract String getRufname();

    // public abstract Date getGebDate();
    public abstract String getGebDate();

    public abstract String getMobilTel();

    public abstract void setPersonID(Integer inValue);

    public abstract void setName(String inValue);

    public abstract void setRufname(String inValue);

    // public abstract void setGebDate(Date inValue);
    public abstract void setGebDate(String inValue);

    public abstract void setMobilTel(String inValue);

    // die zwei create-Methoden:

    // public Integer ejbCreatePerson(String name, String rufname, Date gebDate,
    // String mobilTel)throws
    public Integer ejbCreatePerson(String name, String rufname, String gebDate,
            String mobilTel) throws javax.ejb.CreateException {

        Integer ps = maxPrimaryKey("personID", "PersonEJBTable");
        if (ps == null)
            setPersonID(new Integer(0));
        else {
            setPersonID(new Integer(ps.intValue() + 1));
        }
        setName(name);
        setRufname(rufname);
        setGebDate(gebDate);
        setMobilTel(mobilTel);
        return null;
    }

    // postCreate mit gleichen Parametern
    // public void ejbPostCreatePerson(String name, String rufname, Date
    // gebDate, String mobilTel)throws
    public void ejbPostCreatePerson(String name, String rufname,
            String gebDate, String mobilTel) throws javax.ejb.CreateException {
    }

    // die sieben callback-Methoden des life-cycle
    // aus "javax.ejb.EntityBean"
    public void setEntityContext(EntityContext ctx) {
    }

    public void unsetEntityContext() {
    }

    public void ejbActivate() {
    }

    public void ejbPassivate() {
    }

    public void ejbLoad() {
    }

    public void ejbStore() {
    }

    public void ejbRemove() {
    }

    // nur als Bsp. eine "buisness"-Methode

    public String checkDoubleName() {
        // Doppelnamen enthalten Bindenstrich:
        if (getName().indexOf("-") > -1)
            return getName();
        else
            return null;
    }

    private Integer maxPrimaryKey(String idName, String tabellenName) {
        Integer ps;
        conn = getConn();
        try {
            prepStmt = conn.prepareStatement("SELECT MAX(\"" + idName
                    + "\") FROM \"" + tabellenName + "\"");
            result = prepStmt.executeQuery();
            if (result.next()) {
                ps = new Integer(result.getInt(1));
                closeResourses(conn, prepStmt);
                return ps;
            }
        } catch (SQLException sqle) {
            System.out.println("PersonEJB-SQLException: " + sqle.getMessage());
            closeResourses(conn, prepStmt);
        }

        return null;
    }

    private void closeResourses(Connection conn, PreparedStatement prepStmt) {
        try {
            prepStmt.close();
            conn.close();
        } catch (SQLException sqle) {
            System.out.println("PersonEJB-SQLException: " + sqle.getMessage());
        }
    }

    private Connection getConn() {
        DataSource ds = null;
        try {
            Context jndiContext = new InitialContext();
            ds = (DataSource) jndiContext.lookup("jdbc/Cloudscape");
            return ds.getConnection();
        } catch (NamingException ne) {
            System.out.println("PersonEJB-NamingException: " + ne.getMessage());
        } catch (SQLException sqle) {
            System.out.println("PersonEJB-SQLException: " + sqle.getMessage());
        }
        return null;

    }

}




PersonHome
Код

import javax.ejb.CreateException;
import javax.ejb.FinderException;
import java.rmi.RemoteException;
import java.util.Date;

public interface PersonHome extends javax.ejb.EJBHome {

    public PersonRemote createPerson(String name, String rufname, String gebDate,
            String mobilTel) throws CreateException, RemoteException;

    public PersonRemote findByPrimaryKey(Integer id) throws FinderException,
            RemoteException;

    public java.util.Collection findByFullName(String name, String rufname)
            throws FinderException, RemoteException;

    public java.util.Collection findByName(String name)
            throws FinderException, RemoteException;
    
    public java.util.Collection findByCallName(String rufname)
    throws FinderException, RemoteException;
    
    

}



PersonRemote
Код

import java.rmi.RemoteException;
import java.util.Date;
 
public interface PersonRemote extends javax.ejb.EJBObject {
//     die abstakten Zugriffsmethoden
    public abstract Integer getPersonID() throws RemoteException;
    public abstract String getName()throws RemoteException;
    public abstract String getRufname()throws RemoteException;
    public abstract String getGebDate()throws RemoteException;
    public abstract String getMobilTel()throws RemoteException;
    
    public abstract void setPersonID( Integer inValue)throws RemoteException;
    public abstract void setName(String inValue)throws RemoteException;
    public abstract void setRufname(String inValue)throws RemoteException;
    public abstract void setGebDate(String inValue)throws RemoteException;
    public abstract void setMobilTel(String inValue)throws RemoteException;
    
    public String checkDoubleName() throws RemoteException;
    

}


Автор: Unlimited 22.8.2007, 22:26
есть у кого либо какие-то  идеи, по этому поводу?

Автор: AxNe0 23.8.2007, 11:55
а почему просто не перенести код в SessionBean? не совсем понятно, в чем проблема

Автор: Unlimited 24.8.2007, 00:57
Приветик 

я перенёс в SessionBean. Т.к. эта функция для других EJBs необходима, соответственно я думаю, что  он у PrimaryKeyEJB : Local и LocalHome Interfaces код ниже. 

Как сделать вызов  в PersonEJB  этой функции?
я написал но не уверен, что правильно и как дальше вызвать посмотрите пожалуйста код, что я должен сделать чтобы вызвать  метод maxPrimaryKey(String idName, String tabellenName) находящуюся в PrimaryKeyEJB  из класса PersonEJB (к коде обозначино крассным цветом).



 

PrimaryKeyEJB :

Код

import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;


public class PrimaryKeyEJB implements SessionBean {
    
    Connection conn;

    PreparedStatement prepStmt;

    ResultSet result;


    /** The session context */
    private SessionContext context;

    public PrimaryKeyEJB() {
        // TODO Auto-generated constructor stub
    }

    public void ejbActivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    public void ejbPassivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    public void ejbRemove() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    
    public void setSessionContext(SessionContext newContext)
        throws EJBException {
        context = newContext;
    }

    
    public void ejbCreate() throws CreateException {
        // TODO Add ejbCreate method implementation
    }

    
    public void replaceWithRealBusinessMethod() throws EJBException {
        // rename and start putting your business logic here
    }
    
    private Integer maxPrimaryKey(String idName, String tabellenName) {
        Integer ps;
        conn = getConn();
        try {
            prepStmt = conn.prepareStatement("SELECT MAX(\"" + idName
                    + "\") FROM \"" + tabellenName + "\"");
            result = prepStmt.executeQuery();
            if (result.next()) {
                ps = new Integer(result.getInt(1));
                closeResourses(conn, prepStmt);
                return ps;
            }
        } catch (SQLException sqle) {
            System.out.println("PrimaryKeyEJB-SQLException: " + sqle.getMessage());
            closeResourses(conn, prepStmt);
        }

        return null;
    }

    private void closeResourses(Connection conn, PreparedStatement prepStmt) {
        try {
            prepStmt.close();
            conn.close();
        } catch (SQLException sqle) {
            System.out.println("PrimaryKeyEJB-SQLException: " + sqle.getMessage());
        }
    }

    private Connection getConn() {
        DataSource ds = null;
        try {
            Context jndiContext = new InitialContext();
            ds = (DataSource) jndiContext.lookup("jdbc/Cloudscape");
            return ds.getConnection();
        } catch (NamingException ne) {
            System.out.println("PrimaryKeyEJB-NamingException: " + ne.getMessage());
        } catch (SQLException sqle) {
            System.out.println("PrimaryKeyEJB-SQLException: " + sqle.getMessage());
        }
        return null;

    }

}



PrimaryKeyLocalHome:
Код

mport javax.ejb.CreateException;


public interface PrimaryKeyLocalHome extends javax.ejb.EJBLocalHome {
    
    public PrimaryKeyLocalHome create()throws CreateException;

}



PrimaryKeyLocal:
Код

import javax.ejb.FinderException;


public interface PrimaryKeyLocal extends javax.ejb.EJBLocalObject {
    
    public Integer maxPrimaryKey(String idName, String tabellenName)throws FinderException; 

}


PersonEJB:   в нём вызывается метод maxPrimaryKey из SessionBean(PrimaryKeyEJB )
Код

public abstract class PersonEJB implements EntityBean {
...
...
...
public Integer ejbCreatePerson(String name, String rufname, String gebDate,
            String mobilTel) throws javax.ejb.CreateException {

        PrimaryKeyLocalHome home =  getPrimaryKeyHome();
        Integer ps = home.create();
        
[color=red]Как дальше вызвать из interface PrimaryKeyLocal метод: maxPrimaryKey(String idName, String tabellenName)
        
        Integer ps = ????.....??? maxPrimaryKey("personID", "PersonEJBTable");[/color]    
    
        if (ps == null)
            setPersonID(new Integer(0));
        else {
            setPersonID(new Integer(ps.intValue() + 1));
        }
        setName(name);
        setRufname(rufname);
        setGebDate(gebDate);
        setMobilTel(mobilTel);
        return null;
    }

...
...
private PrimaryKeyLocalHome getPrimaryKeyHome(){
        
        try {
            Context jndiContext =  new InitialContext();
            PrimaryKeyLocalHome home =(PrimaryKeyLocalHome)
            jndiContext.lookup("java:comp/env/ejb/PersonEJB");
            return home;
        } catch (NamingException nex) {
            return null;
        }
    }

Автор: y3u 24.8.2007, 08:34
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/EJB3.html#wp79820

Автор: AxNe0 24.8.2007, 10:52
Unlimited, а зачем тебе вообще оставлять EntityBean? они оооочень редко используются... я бы, к примеру, сделал SessionBean, в котором уже вызывал бы методы обычного класса Person...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)