`
anxin587
  • 浏览: 24075 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

开发bean管理持久化实体bean

阅读更多

我学习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

分享到:
评论

相关推荐

    JAVA Web应用开发:J2EE课件

    开发容器管理持久化实体bean.ppt** - CMP是EJB中自动处理持久化的一种方式,这节课会讲解如何配置和使用,以及它在数据库事务和状态管理上的优势。 9. **9. 消息驱动bean.ppt** - 消息驱动bean(MDB)是JMS与EJB...

    Bean开发实例之三实体Bean开发实例

    ### 实体Bean开发实例 #### 实体Bean基本理论 实体Bean是EJB(Enterprise JavaBeans)框架中的一个重要组成部分,主要用于代表持久化的数据。简而言之,实体Bean是一种服务器端组件,用于封装存储在数据库或其他...

    Ejb开发实体bean

    实体Bean通常用于表示数据库中的实体,它们有持久化状态,并且可以通过其唯一的键(主键)进行识别。在购物车应用中,可能包含`Product`和`Order`这样的实体Bean。 3. **开发实体Bean**:实体Bean需要实现特定的...

    PAS(Primeton Application Server)企业版EJB开发案例分析:有状态/无状态会话Bean与CMP/BMP实体Bean

    主要包括有状态会话Bean (Stateful Session Bean) 和无状态会话Bean (Stateless Session Bean),以及容器管理持久化实体Bean (CMP Entity Bean) 和Bean管理持久化实体Bean (BMP Entity Bean) 的开发过程。...

    EJB实体Bean与事物管理

    - **容器管理持久性**: CMP中,EJB容器负责处理数据的持久化,开发者只需要关注业务逻辑,降低了开发复杂性。 2. **事务管理** - **事务概念**: 在计算机系统中,事务是一系列操作,要么全部完成,要么全部不完成...

    Jboss下开发ejb应用之一实体bean的应用

    4. 注解驱动的实体Bean开发 5. 数据库关系映射 6. EJB本地接口与业务方法 7. JPA和数据源配置 8. 部署与管理 以上就是在JBoss下开发EJB应用,特别是实体Bean应用的基本流程和关键知识点。通过这个过程,开发者可以...

    ejb实体bean实例

    实体Bean(Entity Bean)是EJB的一种类型,它代表业务逻辑中的持久化对象,通常映射到数据库中的表。本篇文章将深入探讨EJB实体Bean的概念、其在Eclipse集成开发环境中的使用,以及与MySQL数据库的集成。 ### 一、...

    EJB3.0源代码,包含会话Bean,实体Bean,还有消息Bean

    - **容器管理的持久性 (Container-Managed Persistence, CMP)**: EJB 3.0引入了注解,使得实体Bean的持久化更加简单,开发者无需编写XML配置文件,只需在Bean类上使用`@Entity`注解即可。 - **Java Persistence ...

    ejb实例包括session bean和实体bean

    2. **Container-managed Persistence (CMP)**:容器负责对象与数据库之间的持久化工作,开发者无需直接处理数据库操作,只需定义实体Bean的字段和属性。 3. **Entity Beans 3.0(EJB 3.0引入)**:简化了Entity Bean...

    EJB 3.0学习之实体Bean

    EJB 3.0是Java企业版(Java EE)中的一个重大改进,它极大地简化了企业级Java组件的开发,特别是对于实体Bean的处理。在EJB 3.0之前,实体Bean通常需要实现Home接口、Remote接口或Local接口,这使得编码过程变得复杂...

    实体Bean继承讲解

    实体Bean继承是Java企业级应用开发中的一个重要概念,特别是在使用Java持久化技术(JPA)进行数据存储时。实体Bean代表数据库中的一个表,而实体Bean之间的继承关系则需要在数据库层面进行适当的映射,以便正确地...

    EJB3.0开发Session Bean.rar

    持久化与实体Bean** 虽然EJB 3.0规范主要讨论Session Bean,但还包含了对实体Bean(Entity Bean)的支持,这些Bean与数据库中的记录对应。`@Entity`注解用于声明一个持久化的Java类,而`@Table`, `@Id`, `@...

    逆向生成工具,有数据库表生成java bean实体类

    在实际开发中,这种逆向生成技术通常结合ORM(Object-Relational Mapping)框架,如MyBatis,来实现数据持久化。MyBatis的SqlMapConfig.xml文件可以引用我们生成的实体类,从而将数据库操作与业务逻辑解耦。这样,当...

    10_开发单表映射的实体bean

    在Java EE规范中,实体Bean是Java对象,它们持久化到数据库中,代表业务逻辑中的实体。EJB(Enterprise JavaBeans)提供了一种标准的方式来创建和管理这些对象,使得开发者能够专注于业务逻辑,而不是底层的数据存储...

    读取文件数据并解析成bean实体类

    3. **Bean实体类**:在Java世界中,Bean是一种符合特定规范的对象,具有无参构造函数、getter/setter方法等特性,常用于数据持久化和对象-关系映射。实体类通常是业务逻辑中的数据载体,每个属性对应着文件中的一个...

    EJB实体Bean学习

    1. **创建(Create)**:使用`new`关键字实例化实体Bean,并设置其属性。然后,调用EJB容器提供的`persist()`方法保存到数据库。 2. **读取(Read)**:通常通过`find()`或`query()`方法根据主键或其他条件获取Bean...

    java持久化工具类:JavaBean与XML

    在Java开发中,持久化是将数据保存到可持久存储设备(如数据库)中的过程,以便在程序关闭后还能保留这些数据。JavaBean和XML在Java持久化中扮演着重要角色,它们是Java应用程序与数据库交互的主要手段。下面将详细...

    EJB三种bean的开发模式

    在JBoss中,实体Bean可以使用EJB 2.x的CMP(容器管理持久性)或EJB 3.x的JPA(Java Persistence API)进行持久化管理。 CMP由容器负责数据的存储和检索,而JPA则允许更灵活的数据映射和查询。 2. 会话Bean(Session...

Global site tag (gtag.js) - Google Analytics