为什么em.persist()对数据库表没有影响?

时间:2017-12-22 07:54:12

标签: jpa transactions ejb

我有一个名为AuthenticationEndpoint的RESTful服务,它检查用户的用户名/密码对,创建令牌,将令牌保存到数据库并将令牌返回给应用程序客户端。 代码无错误和例外。 UserEJB bean应该将令牌保存到令牌数据库表,而AuthenticationEJB bean应该更新用户数据库表中的令牌字段。但正如我在MySQL Workbench中看到的,没有任何内容被保存或更新。 UserEJB.getUsers()方法正常工作并返回用户列表,似乎EJB容器找到了持久性单元 ForthDynamicWebProject ,但为什么我无法保存和更新实体?谢谢你的关注。

AuthenticationEndpoint RESTful服务

@ApplicationScoped
@Path("/authentication")
public class AuthenticationEndpoint {

    @Inject
    AuthenticateEJB authenticateEJB;

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response authenticateUser(String jsonString) {
        Gson gson = new Gson();
        Credentials credentials = gson.fromJson(jsonString, Credentials.class);
        String userName = credentials.getUserName();
        String password = credentials.getPassword();

        try {
            User user = authenticateEJB.checkUser(userName, password);
            if ((user instanceof User) && user != null) {
                return Response.ok().header("token", user.getToken().getToken()).build();
            } else {
                return Response.status(Response.Status.FORBIDDEN).build();
            }
        } catch (Exception e) {
            return Response.status(Response.Status.FORBIDDEN).build();
        }
    }
}

以下是EJB的代码:

AuthenticateEJB

@LocalBean
@Stateless
public class AuthenticateEJB {

@PersistenceContext(unitName = "ForthDynamicWebProject")
EntityManager em;

@Inject
UserEJB userEJB;

public User checkUser(String userName, String password) {
    List<User> users = userEJB.getUsers();

    for (User user : users) {
        if (user.getUsername().equals(userName) && user.getPassword().equals(password)) {
            user.setToken(userEJB.updateToken());
            em.merge(user);
            return user;
        }
    }
    return null;
}
}

UserEJB

@LocalBean
@Stateless
public class UserEJB {

@PersistenceContext(unitName = "ForthDynamicWebProject")
EntityManager em;

@Inject
Token token;

public List<User> getUsers() {
    Query query = em.createQuery("from User");
    return (List<User>) query.getResultList();
}

public Token updateToken() {
    em.persist(token);
    return token;
}
}

的persistence.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="ForthDynamicWebProject" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/second_attempt_hibernate</jta-data-source>
    <class>converters.ConverterLocalDateTime</class>
    <class>entity.DocStatus</class>
    <class>entity.DocType</class>
    <class>entity.Document</class>
    <class>entity.Employee</class>
    <class>entity.MailOrder</class>
    <class>entity.MailOrderStatus</class>
    <class>entity.Token</class>
    <class>entity.User</class>
    </persistence-unit>
</persistence>

更新

令牌实体

@Entity
@Table(name = "tokens")
@NamedQuery(name = "Token.findAll", query = "SELECT t FROM Token t")
public class Token implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Temporal(TemporalType.TIMESTAMP)
private Date loginTime;

private String token;

// bi-directional one-to-one association to User
@OneToOne(mappedBy = "token")
private User user;

public Token() {
    ConverterLocalDateTime converter = new ConverterLocalDateTime();
    loginTime = converter.convertToDatabaseColumn(LocalDateTime.now());
    token = Double.toString(Math.random());
}

*getters and setters are not showed*

用户实体

@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String password;

    private String username;

    //bi-directional one-to-one association to Employee
    @OneToOne(mappedBy="user")
    private Employee employee;

    //bi-directional one-to-one association to Token
    @OneToOne
    @JoinColumn(name="tokID")
    private Token token;

    public User() {
    }

*getters and setters are not showed*

1 个答案:

答案 0 :(得分:0)

也许我错过了一些东西,但是如果你的用户ejb意图绑定到单个用户,情况就不是这样了,因为无状态可以重复用于其他几个客户端,因此令牌将被重用ooled实例。检查这是否是正确的行为。

其次,您不能注入令牌JPA实体或至少不能注入当前代码,该变量将始终为null。也许这就是你没有看到它持续存在的原因。

第三,我还会改变其他事情,但这是另一个不同的问题。