- 浏览: 24075 次
最近访客 更多访客>>
最新评论
-
linginfanta:
没有翻完。
转贴 java 泛型,辛苦译者了 -
阳光晒晒:
等四五小时再看,如果内存下来了
一般是由于数据库连接没关闭.
...
J2EE 系统 outofmemory问题 -
anxin587:
今天一直用jprofiler来跟踪,发现一个奇怪的问题,当to ...
J2EE 系统 outofmemory问题
我学习Jboss部署EJB经常发生这样错误,最终搞定,把解决心得贡献给大家:
在这个错误上面一般都报一些实际错误,如果编译通过,则大多因为:
1.ejb-jar.xml写的有问题,比如缺项或者对应文件找不到。
2.ejb文件写得不规范,比如出现抽象类、缺乏ejb规定的方法。
Bean : TxBean
Method : public abstract Collection findByAccountId(Date, Date, String) throws FinderException
Section: 12.2.11
Warning: Each finder method must match one of the ejbFind<METHOD> methods define
d in the entity bean class.
这就是缺乏ejbFindByAccountId方法
10:01:28,250 WARN [verifier] EJB spec violation: Bean : CustomerBean Section: 12.2.2 Warning: The class must be defined as public and must not be abstract. 10:01:28,265 WARN [verifier] EJB spec violation: Bean : AccountBean Section: 12.2.2 Warning: The class must be defined as public and must not be abstract.
这个就是写了抽象类
上面是中间部署出现错误的求解,类代码如下
package examples.bmp;
import javax.ejb.*;
import java.rmi.*;
public interface Account extends EJBObject
{
// call ejb by this interface
public void deposit(double amt) throws RemoteException,AccountException;
public void withdraw(double amount) throws RemoteException,AccountException;
public double getBalance() throws RemoteException;
public String getOwnerName() throws RemoteException;
public void setOwnerName(String name) throws RemoteException;
public String getAccountID() throws RemoteException;
public void setAccountID(String id) throws RemoteException;
}
package examples.bmp;
import javax.ejb.*;
public interface AccountLocal extends EJBLocalObject
{
// call ejb by this interface
public void deposit(double amt) throws AccountException;
public void withdraw(double amount) throws AccountException;
public double getBalance();
public String getOwnerName();
public void setOwnerName(String name);
public String getAccountID();
public void setAccountID();
}
package examples.bmp;
import javax.ejb.*;
import java.rmi.*;
import java.util.*;
public interface AccountHome extends EJBHome
{
public Account create(String accountID,String ownerName) throws RemoteException,CreateException;
public Account findByPrimaryKey(AccountPK key) throws FinderException,RemoteException;
public Collection findByOwnerName(String name) throws FinderException,RemoteException;
public double getTotalBankValue() throws AccountException,RemoteException;
}
package examples.bmp;
import javax.ejb.*;
import java.rmi.*;
import java.util.*;
public interface AccountLocalHome extends EJBLocalHome
{
public Account create(String accountID,String ownerName) throws CreateException;
public Account findByPrimaryKey(AccountPK key) throws FinderException;
public Collection findByOwnerName(String name) throws FinderException;
public double getTotalBankValue() throws AccountException;
}
package examples.bmp;
public class AccountPK implements java.io.Serializable
{
public String accountID;
public AccountPK(String id)
{
this.accountID=id;
}
public AccountPK()
{
}
public String toString()
{
return this.accountID;
}
public boolean equals(Object o)
{
if(this==o)
return true;
if (!(o instanceof AccountPK))
{
return false;
}
return ((AccountPK)o).accountID.equals(this.accountID);
}
public int hashCode()
{
return accountID.hashCode();
}
}
package examples.bmp;
import java.sql.*;
import javax.naming.*;
import javax.ejb.*;
import java.util.*;
public class AccountBean implements EntityBean
{
protected EntityContext ctx;
/*
BMP的持久化域
accountID是主键域
*/
private String accountID;
private String ownerName;
private double balance;
public AccountBean()
{
System.out.println("New Bank Account Entity Bean java Object create By EJB Container");
}
/*
业务逻辑方法
1 向银行帐户存钱
2 从银行帐户取钱
*/
public void deposit(double amt) throws AccountException
{
System.out.println("deposit "+ amt +"called");
balance+=amt;
}
public void withdraw(double amount) throws AccountException
{
System.out.println("withdraw "+ amount +" called.");
if(amount>balance)
throw new AccountException("your balance is "+balance+" you can not withdraw"+amount);
balance-=amount;
}
/*
getter/setter方法,对应于持久化域
*/
public double getBalance()
{
System.out.println("getBalance called");
return this.balance;
}
public String getOwnerName()
{
System.out.println("getOwnerName called");
return this.ownerName;
}
public void setOwnerName(String name)
{
System.out.println("set owner name called");
this.ownerName=name;
}
public String getAccountID()
{
System.out.println("getAccountID called");
return this.accountID;
}
public void setAccountID(String id)
{
System.out.println("setAccountID called");
this.accountID=id;
}
/*
Home业务方法独立于任何帐号,它返回银行帐号的总和
*/
public double ejbHomeGetTotalBankValue() throws AccountException
{
PreparedStatement pstmt=null;
Connection conn=null;
ResultSet rs=null;
try
{
System.out.println("ejbHomeGetTotalBankValue called");
conn=getConnection();
pstmt=conn.prepareStatement("select sum(balance) as total from accounts");
rs=pstmt.executeQuery();
if(rs.next())
{
return rs.getDouble("total");
}
}
catch (Exception e)
{
}
finally
{
try
{
pstmt.close();
conn.close();
}
catch (Exception e)
{
}
}
throw new AccountException("ERROR");
}
//获得数据库连接
public Connection getConnection() throws Exception
{
try
{
Context ctx=new InitialContext();
javax.sql.DataSource ds= (javax.sql.DataSource)ctx.lookup("java:/SQLSERVER");
return ds.getConnection();
}
catch (Exception e)
{
return null;
}
}
/*
由容器调用,可以再其中获得所需资源
*/
public void ejbActivate()
{
System.out.println("ejbActivate called");
}
/*
在将实体bean从RDBMS删除前,EJB容器负责调用这一方法, 对应于客户调用home.remove
*/
public void ejbRemove() throws RemoveException
{
System.out.println("ejbRemove called");
AccountPK pk=(AccountPK)ctx.getPrimaryKey();
String id=pk.accountID;
PreparedStatement pstmt=null;
Connection conn=null;
try
{
conn=getConnection();
pstmt=conn.prepareStatement("delete from accounts where id=?");
pstmt.setString(1,id);
if(pstmt.executeUpdate()==0)
{
throw new RemoveException("account "+ pk+" failed to remove from database");
}
}
catch (Exception e)
{
}
}
/*
由容器调用,释放持有的资源,以便完成挂起操作
*/
public void ejbPassivate()
{
System.out.println("ejbPassivate called");
}
/*
由容器调用,更新bean实例,以反映存储在RDBMS中的最新值
*/
public void ejbLoad()
{
System.out.println("ejbLoad called");
AccountPK pk = (AccountPK)ctx.getPrimaryKey();
String id=pk.accountID;
PreparedStatement pstmt=null;
Connection conn=null;
ResultSet rs=null;
try
{
conn=getConnection();
pstmt=conn.prepareStatement("select ownerName,balance from accounts where id=?");
pstmt.setString(1,id);
rs=pstmt.executeQuery();
rs.next();
ownerName=rs.getString("ownerName");
balance=rs.getDouble("balance");
}
catch (Exception e)
{
e.printStackTrace();
}
}
/*
由容器调用,更新RDBMS数据,将内存中的实体bean数据更新到数据库中
*/
public void ejbStore()
{
System.out.println("ejbStore called");
PreparedStatement pstmt=null;
Connection conn=null;
try
{
conn=getConnection();
pstmt=conn.prepareStatement("update accounts set ownerName=?,balance=? where id=?");
pstmt.setString(1,ownerName);
pstmt.setDouble(2,balance);
pstmt.setString(3,accountID);
pstmt.executeUpdate();
}
catch (Exception e)
{
}
}
/*
有容器调用,将特定上下文关联到这一EJB实例,一旦设置好,便可以通过它查询到环境信息
*/
public void setEntityContext(EntityContext ctx)
{
System.out.println("setEntityContext called");
this.ctx=ctx;
}
/*
由容器调用,将特定上下文销毁
*/
public void unsetEntityContext()
{
System.out.println("unsetEntityContext called");
this.ctx=null;
}
public void ejbPostCreate(String accountID,String ownerName)
{
}
/*
对应于home接口中的create 当客户调用home接口中的create方法,home对象
会调用ejbCreate方法
*/
public AccountPK ejbCreate(String accountID,String ownerName) throws CreateException
{
PreparedStatement pstmt=null;
Connection conn=null;
try
{
System.out.println("ejbCreate called");
this.accountID= accountID;
this.ownerName=ownerName;
this.balance=0;
conn=getConnection();
pstmt=conn.prepareStatement("insert into accounts(id,ownerName,balance) values(?,?,?)");
pstmt.setString(1,accountID);
pstmt.setString(2,ownerName);
pstmt.setDouble(3,balance);
pstmt.executeUpdate();
return new AccountPK(accountID);
}
catch (Exception e)
{
return null;
}
}
/*
通过主键查找Account
*/
public AccountPK ejbFindByPrimaryKey(AccountPK key) throws FinderException
{
PreparedStatement pstmt=null;
Connection conn=null;
try
{
System.out.println("ejbFindByPrimaryKey called");
conn=getConnection();
pstmt=conn.prepareStatement("select id from accounts where id=?");
pstmt.setString(1,key.toString());
ResultSet rs=pstmt.executeQuery();
rs.next();
return key;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
/*
通过持有人查找account
*/
public Collection ejbFindByOwnerName(String name) throws FinderException
{
PreparedStatement pstmt=null;
Connection conn=null;
Vector v=new Vector();
try
{
System.out.println("ejbFindByOwnerName called");
conn=getConnection();
pstmt=conn.prepareStatement("select id from accounts where ownerName=?");
pstmt.setString(1,name);
ResultSet rs=pstmt.executeQuery();
while(rs.next())
{
String id=rs.getString("id");
v.addElement(new AccountPK(id));
}
return v;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}
package examples.bmp;
public class AccountException extends Exception
{
public AccountException()
{
super();
}
public AccountException(Exception e)
{
super(e.toString());
}
public AccountException(String e)
{
super(e);
}
}
package examples.bmp;
import javax.ejb.*;
import javax.naming.*;
import java.rmi.*;
import javax.rmi.*;
import java.util.*;
public class AccountClient
{
public static void main(String[] args) throws Exception
{
Account account=null;
try
{
Properties props=new Properties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url","jnp://192.168.52.136:1099");
Context ctx=new InitialContext(props);
Object obj=ctx.lookup("AccountEJB");
AccountHome home=(AccountHome)PortableRemoteObject.narrow(obj,AccountHome.class);
System.err.println("Total of all accounts in bak initially="+home.getTotalBankValue());
home.create("123-456-7890","John Smith");
Iterator it=home.findByOwnerName("John Smith").iterator();
if(it.hasNext())
{
account=(Account)javax.rmi.PortableRemoteObject.narrow(it.next(),Account.class);
}
else
{
throw new Exception("could not find account");
}
System.out.println("Initial Balance="+account.getBalance());
account.deposit(100);
System.out.println("After depositing 100, amount balance ="+account.getBalance());
System.out.println("Total of all accounts in bank now "+home.getTotalBankValue());
AccountPK pk = (AccountPK)account.getPrimaryKey();
account=null;
account=home.findByPrimaryKey(pk);
System.out.println("Found account with ID"+pk+", balance="+account.getBalance());
System.out.println("now trying to withdraw 150 ,which is more than is currently avaliable ");
account.withdraw(150);
}
catch (Exception e)
{
}
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<entity>
<ejb-name>AccountEJB</ejb-name>
<home>examples.bmp.AccountHome</home>
<remote>examples.bmp.Account</remote>
<ejb-class>examples.bmp.AccountBean</ejb-class>
<persistence-type>Bean</persistence-type>
<prim-key-class>examples.bmp.AccountPK</prim-key-class>
<reentrant>false</reentrant>
</entity>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>AccountEJB</ejb-name>
<method-intf>Remote</method-intf>
<method-name>*</method-name>
</method>
<method>
<ejb-name>AccountEJB</ejb-name>
<method-intf>Local</method-intf>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<!--
<jndi-name>MySql</jndi-name>
<connection-url>jdbc:mysql://192.168.52.136:3306/test</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password></password>
</local-tx-datasource>
-->
<jndi-name>SQLSERVER</jndi-name>
<connection-url>jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test</connection-url>
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<user-name>sa</user-name>
<password>Cp123456</password>
</local-tx-datasource>
</datasources>
注意把上面的jndi配置拷到jboss下面的deploy下面,jdbc驱动拷到lib下面,运行客户端,ok
发表评论
-
EJB stateful session bean Count Test
2007-09-11 11:17 1550这是根据精通ejb一书中的count stateful ses ... -
EJB helloworld 客户端调用
2007-09-11 08:58 2605前面一块已经讲过了,ejb的打包部署到jboss下面去,部署进 ... -
简单EJB客户端调用的问题
2007-09-05 15:04 1950写好了一个EJB并且也部署到了jboss下面,部署成功,简单说 ... -
开发第一个EJB组件-Hello
2007-09-05 10:50 1596前两天开始学习EJB,想 ...
相关推荐
开发容器管理持久化实体bean.ppt** - CMP是EJB中自动处理持久化的一种方式,这节课会讲解如何配置和使用,以及它在数据库事务和状态管理上的优势。 9. **9. 消息驱动bean.ppt** - 消息驱动bean(MDB)是JMS与EJB...
### 实体Bean开发实例 #### 实体Bean基本理论 实体Bean是EJB(Enterprise JavaBeans)框架中的一个重要组成部分,主要用于代表持久化的数据。简而言之,实体Bean是一种服务器端组件,用于封装存储在数据库或其他...
实体Bean通常用于表示数据库中的实体,它们有持久化状态,并且可以通过其唯一的键(主键)进行识别。在购物车应用中,可能包含`Product`和`Order`这样的实体Bean。 3. **开发实体Bean**:实体Bean需要实现特定的...
主要包括有状态会话Bean (Stateful Session Bean) 和无状态会话Bean (Stateless Session Bean),以及容器管理持久化实体Bean (CMP Entity Bean) 和Bean管理持久化实体Bean (BMP Entity Bean) 的开发过程。...
- **容器管理持久性**: CMP中,EJB容器负责处理数据的持久化,开发者只需要关注业务逻辑,降低了开发复杂性。 2. **事务管理** - **事务概念**: 在计算机系统中,事务是一系列操作,要么全部完成,要么全部不完成...
4. 注解驱动的实体Bean开发 5. 数据库关系映射 6. EJB本地接口与业务方法 7. JPA和数据源配置 8. 部署与管理 以上就是在JBoss下开发EJB应用,特别是实体Bean应用的基本流程和关键知识点。通过这个过程,开发者可以...
实体Bean(Entity Bean)是EJB的一种类型,它代表业务逻辑中的持久化对象,通常映射到数据库中的表。本篇文章将深入探讨EJB实体Bean的概念、其在Eclipse集成开发环境中的使用,以及与MySQL数据库的集成。 ### 一、...
- **容器管理的持久性 (Container-Managed Persistence, CMP)**: EJB 3.0引入了注解,使得实体Bean的持久化更加简单,开发者无需编写XML配置文件,只需在Bean类上使用`@Entity`注解即可。 - **Java Persistence ...
2. **Container-managed Persistence (CMP)**:容器负责对象与数据库之间的持久化工作,开发者无需直接处理数据库操作,只需定义实体Bean的字段和属性。 3. **Entity Beans 3.0(EJB 3.0引入)**:简化了Entity Bean...
EJB 3.0是Java企业版(Java EE)中的一个重大改进,它极大地简化了企业级Java组件的开发,特别是对于实体Bean的处理。在EJB 3.0之前,实体Bean通常需要实现Home接口、Remote接口或Local接口,这使得编码过程变得复杂...
实体Bean继承是Java企业级应用开发中的一个重要概念,特别是在使用Java持久化技术(JPA)进行数据存储时。实体Bean代表数据库中的一个表,而实体Bean之间的继承关系则需要在数据库层面进行适当的映射,以便正确地...
持久化与实体Bean** 虽然EJB 3.0规范主要讨论Session Bean,但还包含了对实体Bean(Entity Bean)的支持,这些Bean与数据库中的记录对应。`@Entity`注解用于声明一个持久化的Java类,而`@Table`, `@Id`, `@...
在实际开发中,这种逆向生成技术通常结合ORM(Object-Relational Mapping)框架,如MyBatis,来实现数据持久化。MyBatis的SqlMapConfig.xml文件可以引用我们生成的实体类,从而将数据库操作与业务逻辑解耦。这样,当...
在Java EE规范中,实体Bean是Java对象,它们持久化到数据库中,代表业务逻辑中的实体。EJB(Enterprise JavaBeans)提供了一种标准的方式来创建和管理这些对象,使得开发者能够专注于业务逻辑,而不是底层的数据存储...
3. **Bean实体类**:在Java世界中,Bean是一种符合特定规范的对象,具有无参构造函数、getter/setter方法等特性,常用于数据持久化和对象-关系映射。实体类通常是业务逻辑中的数据载体,每个属性对应着文件中的一个...
1. **创建(Create)**:使用`new`关键字实例化实体Bean,并设置其属性。然后,调用EJB容器提供的`persist()`方法保存到数据库。 2. **读取(Read)**:通常通过`find()`或`query()`方法根据主键或其他条件获取Bean...
在Java开发中,持久化是将数据保存到可持久存储设备(如数据库)中的过程,以便在程序关闭后还能保留这些数据。JavaBean和XML在Java持久化中扮演着重要角色,它们是Java应用程序与数据库交互的主要手段。下面将详细...
在JBoss中,实体Bean可以使用EJB 2.x的CMP(容器管理持久性)或EJB 3.x的JPA(Java Persistence API)进行持久化管理。 CMP由容器负责数据的存储和检索,而JPA则允许更灵活的数据映射和查询。 2. 会话Bean(Session...