请教Robbin一个Hibernate和EJB协作的问题

我在Weblogic8.1启动的时候将SessionFactory绑定到了JNDI上去。所有的持久化类及映射文件都打到一个包里HibernateCAT.jar。将该jar添加到Weblogic的启动文件的CLASSPATH上去。在一个EJB中,我按如下方式调用Hibernate:

SessionFactory sessionFactory;
Session session;
Transaction transaction;

try
{
//获取Session工厂
Context ctx = new InitialContext();
sessionFactory = (SessionFactoryImpl) ctx.lookup("hibernate");

//启动事务
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}catch(Exception e)
{
System.out.println("启动事务的时候出错!");
e.printStackTrace();
return null;
}
//下面根据该JVTSession实现管理的值对象来判断,并分别调用Hibernate持久化框架的数据
//记录添加实现来完成记录的创建
if(managedEntityValue instanceof OrderBaseValue)
{
//to do...
OrderBase orderBase = new OrderBase();
OrderBaseValue orderValue = (OrderBaseValue)managedEntityValue;
orderBase.setId(orderValue.getOrderID());
orderBase.setName(orderValue.getName());
orderBase.setType(orderValue.getType());
orderBase.setCustid(orderValue.getCustID());
try
{
//开始添加记录
session.save(orderBase);
//提交并结束事务
transaction.commit();
}catch(Exception e)
{
try
{
transaction.rollback();
}catch(HibernateException he)
{
System.out.println("回滚事务出错!");
}
System.out.println("提交事务出错!");
e.printStackTrace() ;
}
}
该EJB作为一个独立的jar部署到Weblogic上。

编写一个测试该EJB的客户端运行出现如下错误:
net.sf.hibernate.MappingException: No persister for: com.huawei.ibss.po.OrderBas
e
at net.sf.hibernate.impl.SessionFactoryImpl.getPersister(SessionFactoryI
mpl.java:426)
at net.sf.hibernate.impl.SessionImpl.getPersister(SessionImpl.java:2248)

at net.sf.hibernate.impl.SessionImpl.getPersister(SessionImpl.java:2255)

at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:601)
at com.huawei.ibss.ordermsg.OrderMsgJVTSessionBean.createManagedEntityBy
Value(OrderMsgJVTSessionBean.java:114)
at com.huawei.ibss.ordermsg.OrderMsgJVTSession_isibbm_EOImpl.createManag
edEntityByValue(OrderMsgJVTSession_isibbm_EOImpl.java:154)
at com.huawei.ibss.ordermsg.OrderMsgJVTSession_isibbm_EOImpl_WLSkel.invo
ke(Unknown Source)
at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:466)
at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerR
ef.java:108)
at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:409)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(Authenticate
dSubject

你提供的信息不足,判断不出是哪里的错误,单纯看error message,你那个持久对象找不到ClassPersister类,应该是hbm配置不对。

另外在EJB里面应该让容器来管理事务,不要写任何Hibernate事务控制代码。

首先非常感谢Robbin的热心!!

我建立我两个持久类Cat和OrderBase。都在Weblogic启动的时候填充到SessionFactory里去了。用的是在你的站点看到的绑定SessionFactory到Weblogic的JNDI的方法。http://www.jdon.com/jive/article.jsp?forum=16&thread=9188:
Configuration conf = new Configuration().addClass(Cat.class).addClass(OrderBase.class); SessionFactory sf = conf.buildSessionFactory();

Weblogic启动的时候提示绑定成功。两个持久类也分别配置成功。

Hibernate的参考手册说如果用CMP,就无需事务处理。但是如果我用BMP,是否事务就是必须的?

可能你的客户端代码写的不对。

BMP你就不会用容器管理事务了?

Robbin言之有理啊。汗……

原来就是我错用事务的问题。但是现在我按如下的代码。运行没有任何问题。但是发现数据库中没有任何新增加的记录。请问是否漏了什么?

OrderBase orderBase = new OrderBase();
OrderBaseValue orderValue = (OrderBaseValue)managedEntityValue;
orderBase.setName(orderValue.getName());
orderBase.setType(orderValue.getType());
orderBase.setCustid(orderValue.getCustID());
try
{
//开始添加记录
session.flush();
session.close();
}

补充一点,我在flush语句前添加了session.save(orderBase);
Weblogic窗口在我上面的代码运行完毕打印的是:
Hibernate: insert into ORDERBASE (NAME, TYPE, CUSTID, ORDERID) values (?, ?, ?,
?)

很明显似乎是数据没有传过去。但是我在set数据的时候打印数据确实已经传递到了我的OrderValue对象里。

如果你要用容器管理事务,Hibernate应该使用App Server的数据库连接池。