Java entityManager.persist()在servlet中工作,但不在单独的类中
我不熟悉JPA和Hibernate。我正在尝试使用Java entityManager.persist()在servlet中工作,但不在单独的类中,java,hibernate,jpa,Java,Hibernate,Jpa,我不熟悉JPA和Hibernate。我正在尝试使用entityManager.persist()将Thing插入数据库中的Thing表中。当我在servlet中执行此操作时,会添加对象,但当我从单独的类中执行此操作,并从servlet调用该方法时,不会添加对象 这项工作: // servlet @PersistenceContext EntityManager em; @Resource UserTransaction utx; protected void processRequest(H
entityManager.persist()
将Thing
插入数据库中的Thing
表中。当我在servlet中执行此操作时,会添加对象
,但当我从单独的类中执行此操作,并从servlet调用该方法时,不会添加对象
这项工作:
// servlet
@PersistenceContext
EntityManager em;
@Resource
UserTransaction utx;
protected void processRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
Thing thing = new Thing("word");
utx.begin();
em.persist(thing);
utx.commit();
} catch (Exception ex) { }
}
但这并不是:
// servlet
protected void processRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Thing thing = new Thing("word");
ThingDao thingDao = new ThingDao();
thingDao.add(thing);
}
鉴于
// ThingDao
public class ThingDao {
@PersistenceContext
EntityManager em;
@Resource
UserTransaction utx;
public void add(Thing thing) {
try {
utx.begin();
em.persist(thing);
utx.commit();
} catch (Exception ex) { }
}
}
为什么第二种方法不起作用?如何使其工作?注释@Component并自动连接,因为没有DI //星岛
@Compoenent
public class ThingDao {
@PersistenceContext
EntityManager em;
@Resource
UserTransaction utx;
public void add(Thing thing) {
try {
utx.begin();
em.persist(thing);
utx.commit();
} catch (Exception ex) { }
}
}
//在servlet中
@Autowired
ThingDao td;
protected void processRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Thing thing = new Thing("word");
td.add(thing);
}
注释@Component并自动连接它,因为没有DI //星岛
@Compoenent
public class ThingDao {
@PersistenceContext
EntityManager em;
@Resource
UserTransaction utx;
public void add(Thing thing) {
try {
utx.begin();
em.persist(thing);
utx.commit();
} catch (Exception ex) { }
}
}
//在servlet中
@Autowired
ThingDao td;
protected void processRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Thing thing = new Thing("word");
td.add(thing);
}
通过研究代码,我发现您正在使用Spring,如果这样,您缺少以下内容:
希望通过研究代码能有所帮助,我认为您正在使用Spring,如果您缺少以下内容:
希望它有帮助
newthingdao()
-这样创建实例会导致容器不知道它的存在,因此不会发生注入。让容器将实例注入servlet或执行查找(当然,它应该是一个可注入的bean,您可能不需要CDI的依赖范围)此外,您应该意识到,catch(Exception ex){}
非常危险。您很可能会遇到NullPointerException
,但由于您甚至没有记录异常,因此您永远看不到它,因此不得不想知道“为什么该异常没有持久化”-记录异常应该会让您意识到ThingDao
中的utx
和em
为空,这会相应地引导您的问题。-注意:不要使用空的catch块!尝试发送到ThingDao em中,就像类ThingDao{public ThingDao(EntityManager em){this.em=em;}
和在processRequest中makeThingDao ThingDao=newthingdao(em);ThingDao.add(thing);
@Dred尝试了你的建议,但没有成功。不过我确实修改了ThingDao
中的add
方法,并使用ThingDao.add(thing,em,utx)调用了它
,在调用方法时传递EntityManager和UserTransaction,它现在可以添加记录了!但是除了thing
,还必须传递em
和utx
…我想知道是否有其他方法可以实现这一点而不必执行em.persist(thing)
在servlet本身中。Spring会帮助您完成这一点,或者其他DI)。我看到了关于new ThingDao()
的答案-这样创建实例会导致容器不知道它存在,因此无法进行注入。要么让容器将实例注入servlet,要么进行查找(当然,它应该是一个可注入bean,并且您可能不想要CDI的依赖范围)此外,您应该意识到catch(Exception ex){}
非常危险。您很可能会得到NullPointerException
,但是由于您甚至不记录异常,所以您永远不会看到它,因此不得不怀疑“为什么那个东西没有持久化”-记录异常应该会让你意识到ThingDao
中的utx
和em
是空的,这会相应地引导你的问题。-注意:不要使用空的catch块!尝试像class ThingDao{public ThingDao>一样发送到ThingDao em中(EntityManager em){this.em=em;}
并在进程中请求makeThingDao ThingDao=newthingdao(em);ThingDao.add(thing);
@Dred尝试了您建议的方法,但没有起作用。不过,我修改了ThingDao
中的add
方法,并使用ThingDao.add(thing,em,utx)调用了它
,在调用方法时传递EntityManager和UserTransaction,它现在可以添加记录了!但是除了thing
,还必须传递em
和utx
…我想知道是否有其他方法可以实现这一点而不必执行em.persist(thing)
在servlet本身中。Spring可以帮助您实现这一点,或者其他DI)。我看到了一个答案,我之前没有实际使用Spring,只是使用Hibernate。但是我将Spring Framework 4.0.1库添加到了我的项目中(在NetBeans中)并尝试了您的建议。结果仍然相同。您是否尝试过从serverlet设置EntityManager em;和UserTransaction utx;?也就是说,您需要在ThingDao中为em和utx创建setter,然后在serverletI中设置。我事先并没有实际使用Spring,只是使用Hibernate。但我在我的项目中添加了Spring Framework 4.0.1库(在NetBeans中)并尝试了您的建议。结果仍然相同。您是否尝试过从serverlet设置EntityManager em;和UserTransaction utx;?即,您需要在ThingDao中为em和utx创建setter,然后在serverlet中设置它们