我有一个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.
}
}
问题:RegisterBean
的register()
方法不影响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/