java - 使用 EntityManager JPA EclipseLink 更新实体

标签 java jpa eclipselink spring-roo

我得到一个错误:重复键值违反唯一约束“users_pkey” 详细信息: key (userid)=(2701) 已经存在。 每当我使用持久模型更新我的用户实体时。

在下面的代码示例中:SetLoginAttempts 接受一个已被查询的用户实体,当我开始事务时,我只需设置该实体的字段之一并调用 persist(),然后提交事务。

/**
* @param user
* @param attemptNumber
*/
@Transactional
public void setLoginAttempts(Users user, int attemptNumber){         
    user.setLoginAttempts(attemptNumber);
    System.out.println(user);
}

以下是我如何引用和获取实体管理器:

eFactory = Persistence.createEntityManagerFactory("persistenceUnit");
eManager = eFactory.createEntityManager();

在查看堆栈跟踪时,我注意到提交实际上注入(inject)了一个插入

Call: INSERT INTO USERS (userID, EMAIL, ISLOCKED, LOGINATTEMPTS, passwordHash, passwordSalt, USERNAME, version) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
bind => [2701, admin@d.com, false, 1, $shiro1$SHA-256$500000$6mqzZ/d/3BLQuJqLh1dDhQ==$NKW7Z++o/JTvf884aDWhP3Uhpyb5fTPMrm4joWnw7nI=, [B@1a8e3115, admin, 1]

在 Spring roo 中引用实体管理器、更新字段并提交更改的正确方法是什么?

编辑

我在方法中添加了@Transactional,堆栈跟踪显示这是在创建实体管理器实例:

2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Creating new transaction with name [org.bixin.dugsi.service.UserService.setLoginAttempts]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Opened new EntityManager [org.eclipse.persistence.internal.jpa.EntityManagerImpl@46b9979b] for JPA transaction
[EL Finer]: 2012-03-14 23:49:15.503--ServerSession(2128384958)--Thread(Thread["http-bio-8080"-exec-18,5,main])--client acquired: 1116759395
[EL Finer]: 2012-03-14 23:49:15.503--ClientSession(1116759395)--Thread(Thread["http-bio-8080"-exec-18,5,main])--acquire unit of work: 368076985
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Not exposing JPA transaction [org.eclipse.persistence.internal.jpa.EntityManagerImpl@46b9979b] as JDBC transaction because JpaDialect [org.springframework.orm.jpa.DefaultJpaDialect@c595bcd] does not support JDBC Connection retrieval
Email: admin@d.com, Id: 2701, IsLocked: false, LoginAttempts: 2, Password: $shiro1$SHA-256$500000$6mqzZ/d/3BLQuJqLh1dDhQ==$NKW7Z++o/JTvf884aDWhP3Uhpyb5fTPMrm4joWnw7nI=, PasswordSalt: [B@1a8e3115, Roles: 0, Username: admin, Version: null
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction commit
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [org.eclipse.persistence.internal.jpa.EntityManagerImpl@46b9979b]
[EL Finer]: 2012-03-14 23:49:15.503--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--begin unit of work commit
[EL Finer]: 2012-03-14 23:49:15.503--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--end unit of work commit
[EL Finer]: 2012-03-14 23:49:15.504--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--resume unit of work
2012-03-14 23:49:15,504 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [org.eclipse.persistence.internal.jpa.EntityManagerImpl@46b9979b] after transaction
2012-03-14 23:49:15,504 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager
[EL Finer]: 2012-03-14 23:49:15.504--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--release unit of work

但即使刷新后仍然没有更新数据库,为什么事务不关闭并更新数据库?

最佳答案

JPA 公开了两种方法...persist() 和 merge()

Persist:Persist 负责向 DB 插入新行,然后将实体与 JPA session 中的状态相关联。

合并:合并获取现有实体并更新数据库行。它还会更新 JPA session 中实体的状态。

我认为该用户已经存在于您的数据库表中。为了更新登录计数,您可以在 EntityManager 上使用 merge() 方法。

关于java - 使用 EntityManager JPA EclipseLink 更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9713617/

相关文章:

java - 将 JPA Eclipse Link 查询结果映射到 POJO

java - 2.0.9 和 2.1.0 之间的 Spring Boot eclipselink ddl 自动生成问题

java - java游戏客户端/mysql数据库的认证机制

java - 请求参数为空的路径的 RequestMapping

java - 字符串基数排序 - StringIndexOutOfBoundsEception

java - Spring Boot中无法建立一对一关系,@JoinColumns(列不存在)

java - 无法预部署处于无效状态的 PersistenceUnit [PU] [DeployFailed]

java - 如果应用程序使用不同于 MySQL 的时区,则 Hibernate 保存/检索日期减去天数

java - 持久异常 : Row size too large

java - 配置tomcat、hibernate和mysql