Java entityManager.persist()在servlet中工作,但不在单独的类中

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

我不熟悉JPA和Hibernate。我正在尝试使用
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,如果这样,您缺少以下内容:

  • 类ThingDao

    @交易的 @存储库 公共类ThingDao{

  • serverlet:你需要在那里自动连接东西

    @自动连线 ThingDao td


  • 希望通过研究代码能有所帮助,我认为您正在使用Spring,如果您缺少以下内容:

  • 类ThingDao

    @交易的 @存储库 公共类ThingDao{

  • serverlet:你需要在那里自动连接东西

    @自动连线 ThingDao td


  • 希望它有帮助

    newthingdao()
    -这样创建实例会导致容器不知道它的存在,因此不会发生注入。让容器将实例注入servlet或执行查找(当然,它应该是一个可注入的bean,您可能不需要CDI的依赖范围)此外,您应该意识到,
    catch(Exception ex){}
    非常危险。您很可能会遇到
    NullPointerException
    ,但由于您甚至没有记录异常,因此您永远看不到它,因此不得不想知道“为什么该异常没有持久化”-记录异常应该会让您意识到
    ThingDao
    中的
    utx
    em
    为空,这会相应地引导您的问题。-注意:不要使用空的catch块!尝试发送到ThingDao em中,就像
    类ThingDao{public ThingDao(EntityManager em){this.em=em;}
    和在processRequest中make
    ThingDao 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;}
    并在进程中请求make
    ThingDao 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中设置它们