JPA:在Managed Bean中无法持久化实体

时间:2013-06-01 16:47:44

标签: java-ee jpa jsf-2 managed-bean persist

我是jpa和jsf的新手。我正在尝试使用jpa和jsf开发简单的Web应用程序。我已经安装了mysql并配置了Glassfish来使用它。我创建了一个小项目,它由一个Managed Bean和一个JPA Entity组成。虽然部署表在数据库中成功创建,但是与数据库的连接是可以的。但我有一个问题,我不能在Managed Bean方法中坚持任何实体:

@ManagedBean(name = "data")
@SessionScoped
public class Data implements Serializable {

    @PersistenceUnit(unitName = "JChatPU")
    EntityManagerFactory emf;

    @Resource
    UserTransaction utx;

    public Data() {
    }

    public void add() {
        EntityManager em = emf.createEntityManager();
        try {
            utx.begin();
            JChatUser u = new JChatUser();
            em.persist(u);
            utx.commit();
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

我在persistence.xml中的持久性单元配置:

  <persistence-unit name="JChatPU" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/jchatdb</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
  </persistence-unit>

但我可以成功地从EJB继承。那么,如何从托管bean的方法中继续?

感谢未来的答案。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题!

问题在于我调用bean方法的方式:

<h:commandButton id="add" value="add" action="#{data.add()}" />

它不起作用,因为我们需要以以下形式播放命令按钮:

<h:form>
    <h:commandButton id="add" action="#{data.meth()}" value="add"/>
</h:form>