ejb3.0中entityManager问题

magic_feng 2008-12-09 09:48:51
我用netbeans开发ejb程序,服务器是glassfish,但客户端调用远程接口时总会有nullpointexception问题
原因我想了一下,可能是entityManager em时没有实例化,但用SessionContext的lookup方法查jndi又查找不到,请问是什么问题

主要代码如下
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package SessionBean;

import EntityBean.BookInfo;
import java.util.List;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
*
* @author magic
*/
@Stateless
public class BookInfoFacade implements BookInfoFacadeLocal, BookInfoFacadeRemote {
@PersistenceContext
private EntityManager em;
SessionContext ctx;

public void upadtebookid(String name){
try{
BookInfo bookInfo=em.find(BookInfo.class, 1);
bookInfo.setBookName(name);
em.merge(bookInfo);
}
catch(Exception e)
{
// System.out.println(e.getMessage().toString());
}
}

public void del(){

}

public void create(BookInfo bookInfo) {
em=(EntityManager)ctx.lookup("MiddleWareWebService-ejbPU");
em.persist(bookInfo);

}

public void edit(BookInfo bookInfo) {
em.merge(bookInfo);
}

public void remove(BookInfo bookInfo) {
em.remove(em.merge(bookInfo));
}

public BookInfo find(Object id) {
return em.find(EntityBean.BookInfo.class, id);
}

public List<BookInfo> findAll() {
return em.createQuery("select object(o) from BookInfo as o").getResultList();
}

}

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package middlewarewebservice;
import SessionBean.*;
import EntityBean.*;
import javax.ejb.EJB;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.EntityManager;

/**
*
* @author magic
*/
public class NewClass {
@EJB
private static BookInfoFacadeRemote bookInfoFacade=new BookInfoFacade();;

public static void main(String[] args) {


BookInfo book=new BookInfo();
book.setBookId(2);
book.setBookName("good");
book.setBookType("fuck");
book.setPrice(100.0);

bookInfoFacade.create(book);

System.out.println("oki");

}
}


问题是一直说em,nullpointexception,
那些配置是用netbeans自动生成的不知道是否有问题,persisitence.xml文件是这样的
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="MiddleWareWebService-ejbPU" transaction-type="JTA">
<jta-data-source>MiddleWareWebService</jta-data-source>
<class>EntityBean.BookInfo</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="toplink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
<persistence-unit name="MiddleWareWebService-ejbPU2" transaction-type="JTA">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<jta-data-source>jdbc/sample</jta-data-source>
<properties>
<property name="toplink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
...全文
439 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yalanjia 2009-12-31
  • 打赏
  • 举报
回复
不对吧,用JNDI获得的是容器托管的entityManager,不需要创建EntityManagerFactory对象,而且你用sessioncontext的lookup方法查到的也不是entityManagerFactory对象,而就是EntityManager对象。你最好在那个@PersistenceContext那表明name属性的内容.他表示的是制定持久化上下文的JNDI名称。
wchunfeng068 2009-08-04
  • 打赏
  • 举报
回复
@EJB
private static BookInfoFacadeRemote bookInfoFacade=new BookInfoFacade();;






好像这个new就不应该有了吧。
magic_feng 2008-12-10
  • 打赏
  • 举报
回复
help!!
magic_feng 2008-12-09
  • 打赏
  • 举报
回复
我用的是sql server,不知道是否是这个问题
magic_feng 2008-12-09
  • 打赏
  • 举报
回复
客户端我改用这样
final EntityManagerFactory emf=Persistence.createEntityManagerFactory("MiddleWareWebService-ejbPU");
final EntityManager em=emf.createEntityManager();
em.persist(book);
出现的好像是jndi的问题
2008-12-9 11:57:17 com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl <init>
警告: "IOP00410201: (COMM_FAILURE) 连接失败: 套接字类型: IIOP_CLEAR_TEXT;主机名: localhost;端口: 3700"
org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No
at com.sun.corba.ee.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2690)
at com.sun.corba.ee.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2711)
at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:261)
at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:274)
at com.sun.corba.ee.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:130)
at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:192)
at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:181)
at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClientDelegateImpl.java:325)
at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112)
at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:69)
at com.sun.enterprise.naming.SerialContext.narrowProvider(SerialContext.java:131)
at com.sun.enterprise.naming.SerialContext.getCachedProvider(SerialContext.java:247)
at com.sun.enterprise.naming.SerialContext.getRemoteProvider(SerialContext.java:205)
at com.sun.enterprise.naming.SerialContext.getProvider(SerialContext.java:160)
at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:398)
at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:445)
at javax.naming.InitialContext.lookup(InitialContext.java:396)
at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:129)
at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)
at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:280)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:229)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:120)
at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:91)
magic_feng 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 HeroAlur 的回复:]
persisitence.xml有问题
如果你有多个持久性单元
申明em的时候一定要加上 @PersistenceContext (unitName = yourPUname)标注
不然em不知道该连接哪个PU
[/Quote]

加了@PersistenceContext(unitName ="MiddleWareWebService-ejbPU")
仍然是这个错误
Exception in thread "main" java.lang.NullPointerException
at SessionBean.BookInfoFacade.create(BookInfoFacade.java:43)
at middlewarewebservice.NewClass.main(NewClass.java:42)
Java Result: 1
magic_feng 2008-12-09
  • 打赏
  • 举报
回复
我用lookup查找jndi出现如下错误
com.sun.gjc.spi.jdbc40.DataSource40 cannot be cast to SessionBean.BookInfoFacade
HeroAlur 2008-12-09
  • 打赏
  • 举报
回复
em=(EntityManager)ctx.lookup("MiddleWareWebService-ejbPU");
是没必要的
只要用标注声明PU名就可以了
HeroAlur 2008-12-09
  • 打赏
  • 举报
回复
persisitence.xml有问题
如果你有多个持久性单元
申明em的时候一定要加上 @PersistenceContext (unitName = yourPUname)标注
不然em不知道该连接哪个PU
cxalxpks 2008-12-09
  • 打赏
  • 举报
回复
看不出问题,关注一下。
mick56 2008-12-09
  • 打赏
  • 举报
回复
-.-
magic_feng 2008-12-09
  • 打赏
  • 举报
回复
部署ejb模块时会出现如下错误
部署错误:
尚未部署该模块。
有关详细信息,请参见服务器日志。
at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:166)
at org.netbeans.modules.j2ee.ant.Deploy.execute(Deploy.java:104)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
at sun.reflect.GeneratedMethodAccessor342.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:277)
at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:460)
at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:151)
Caused by: 尚未部署该模块。
at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:160)
... 16 more
magic_feng 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 HeroAlur 的回复:]
用法有问题:

客户端是不能使用em的 所有事务性操作都要在EJB中完成

远程调用EJB时 必须用lookup方法查找接口

如下代码:
EJB:
@Stateless (mappedName = "CB")
public class ConfigBean implements ConfigRemote, ConfigLocal
{
@PersistenceContext (unitName = "xxxPU")
private EntityManager em;
...
CLIENT:
ConfigRemote cr = null;
try
{ …
[/Quote]

请问lookup查找的是什么?
我用你的方法,异常显示cb not found
是必须通过这个映射吗?
@Stateless (mappedName = "CB")
HeroAlur 2008-12-09
  • 打赏
  • 举报
回复
用法有问题:

客户端是不能使用em的 所有事务性操作都要在EJB中完成

远程调用EJB时 必须用lookup方法查找接口

如下代码:
EJB:
@Stateless (mappedName = "CB")
public class ConfigBean implements ConfigRemote, ConfigLocal
{
@PersistenceContext (unitName = "xxxPU")
private EntityManager em;
...
CLIENT:
ConfigRemote cr = null;
try
{
Context c = new InitialContext();
cr = (ConfigRemote) c.lookup("CB");
System.out.println("link success!");
}
catch (Exception ne)
{
System.out.println("link error!");
return;
}

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧