java - 实体管理器不持久化类实例

标签 java mysql jsf javabeans entitymanager

我有一个faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">
    <managed-bean>
        <managed-bean-name>registerBean</managed-bean-name>
        <managed-bean-class>com.beans.RegisterBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

User 类:

package model;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the users database table.
 * 
 */
@Entity
@Table(name="users")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable 
{
    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    private String password;

    private String userName;

    public User() {
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

和一个RegisterBean类:

package com.beans;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.transaction.UserTransaction;

import model.User;

//see faces-config.xml to see annotations

public class RegisterBean 
{
    @PersistenceContext(unitName="user-unit", type=PersistenceContextType.EXTENDED) 
    private EntityManager em;

    private String name;
    private String password;
    private String passwordRepeat;

    public String getPasswordRepeat() 
    {
        return passwordRepeat;
    }


    public void setPasswordRepeat(final String passwordRepeat) 
    {
        this.passwordRepeat = passwordRepeat;
    }


    public String getName ()
    {
        return name;
    }


    public void setName (final String name)
    {
        this.name = name;
    }


    public String getPassword ()
    {
        return password;
    }


    public void setPassword (final String password)
    {
        this.password = password;
    }

    public void register()
    {
        //TODO: validate username and password
        User newUser = new User();
        newUser.setPassword(password);
        newUser.setUserName(name);
        //User foundUser = em.find(User.class, 22); //this actually finds the user with Id 22

        em.persist(newUser); //TODO: find out why this doesn't work.
    }
}

问题:RegisterBeanregister()方法影响MySQL表,即em.persist() 不会引发任何异常,但该实体不会进入我的数据库。谁能帮我吗?

编辑:按要求
持久化.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="user-unit">
        <jta-data-source>java:jboss/datasources/DefaultDS</jta-data-source>
    </persistence-unit>
</persistence>

最佳答案

在 Java EE 6 中,为了创建事务,您需要 EJB(容器管理事务)或自己管理事务边界(Bean 管理事务)。请参阅链接的教程。

最简单的方法是这两种方法中的第一种:要实现它,只需将相关代码移动到 @Stateless EJB 中(确保您的持久性上下文未扩展)

RegisterBean

public class RegisterBean {    
    @EJB MyService service;

    public void register() {
        //TODO: validate username and password
        User newUser = new User();
        newUser.setPassword(password);
        newUser.setUserName(name);
        service.create(newUser);
    }
}

我的服务

@Stateless
public class MyService {
    @PersistenceContext(unitName="user-unit") 
    private EntityManager em;

    public void create(User newUser) {
        em.persist(newUser);
    }
}

有用的链接

关于java - 实体管理器不持久化类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803317/

相关文章:

Java - 将字符串转换为具有 10 位或更多小数的 double 型

php - 在 PHP 的 OOP 编程中设置我的类的正确方法是什么?

部署 Tomcat6 JSF 应用程序时出现解析错误 - digester.Digester

java - onShow 事件在每个页面重新加载期间不必要地触发

java - Maven 构建从 WEB-INF 文件夹中排除一些 .xml 文件

java - JLabel 垂直对齐不按预期工作

java - 您使用什么技术来调试复杂的 guice 绑定(bind)?

PHP:mySQL:无法更新数据库中的所有行。表正在部分更新

mysql - 使用 CROSS JOIN 的超慢查询

java - 防止 JSF 中的 XSS 反射 <f :param>