【发布时间】:2016-06-15 19:20:52
【问题描述】:
我的 Spring Boot 应用程序中有两个实体:
用户:
public class User implements java.io.Serializable, UserDetails {
@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "person") )
@Id
@GeneratedValue(generator = "generator")
@Column(name = "person_id", unique = true, nullable = false)
public int getPersonId() {
return this.personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Person getPerson() {
return this.person;
}
public void setPerson(Person person) {
this.person = person;
}
@Column(name = "email", unique = true, nullable = false, length = 50)
public String getEmail() {
return this.email;
}
public void setLoginVersuche(int loginVersuche) {
this.loginVersuche = loginVersuche;
}
@Column(name ="loginVersuche")
public int getLoginVersuche() {
return loginVersuche;
}
...omitted code...
}
和人:
public class Person implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "idPerson", unique = true, nullable = false)
public Integer getIdPerson() {
return this.idPerson;
}
public void setIdPerson(Integer idPerson) {
this.idPerson = idPerson;
}
@OneToOne(fetch = FetchType.LAZY, mappedBy = "person")
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
...omitted code...
}
我有我的 DAO:
@Repository
public interface UserDAO extends CrudRepository<User, Integer>{
User findByEmail(String user);
}
现在我想更新身份验证中的字段。为此,我要求用户对象(电子邮件是唯一的)并设置字段。在此之后我想更新 db 中的对象:
User userByDB = userDAO.findByEmail(username);
userByDB.setLoginVersuche(userByDB.getLoginVersuche()+1);
userDAO.save(userByDB);
它只是不更新数据库中的数据字段,但我也没有收到错误。是否与我在用户中作为外键的主键有关?
UPDATE-1
@Transactional
@Modifying
@Query("update User u set u.loginVersuche = u.loginVersuche+1, u.gesperrt = ?1 where u.email = ?2")
public int incrementLoginVersuche(boolean gesperrt, String email);
UPDATE-2
23:51:43.181 TRACE org.springframework.transaction.support.TransactionSynchronizationManager - 初始化事务同步 23:51:43.182 TRACE org.springframework.transaction.interceptor.TransactionInterceptor - 获取 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.incrementLoginVersuche] 的交易 23:51:43.183 调试 org.springframework.orm.jpa.EntityManagerFactoryUtils - 打开 JPA EntityManager 23:51:43.184 TRACE org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl - 打开休眠会话。租户=null,所有者=org.hibernate.jpa.internal.EntityManagerImpl@71dfe394 23:51:43.184 TRACE org.hibernate.internal.SessionImpl - 在时间戳打开会话:14569591031 23:51:43.185 TRACE org.hibernate.internal.SessionImpl - 将刷新模式设置为:AUTO 23:51:43.186 TRACE org.hibernate.internal.SessionImpl - 将缓存模式设置为:NORMAL 23:51:43.189 调试 org.springframework.orm.jpa.EntityManagerFactoryUtils - 为 JPA EntityManager 注册事务同步 23:51:43.207 跟踪 org.springframework.transaction.support.TransactionSynchronizationManager - 键 [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3d018d7d] 的绑定值 [org.springframework.orm.jpa.EntityManagerHolder@1028e769] 到线程 [http -nio-8443-exec-2] 23:51:43.208 TRACE org.hibernate.engine.query.spi.QueryPlanCache - 位于缓存中的 HQL 查询计划(更新用户 u 设置 u.loginVersuche = u.loginVersuche+1,u.gesperrt = ?1 where u.email = ?2) 23:51:43.210 TRACE org.springframework.transaction.support.TransactionSynchronizationManager - 键 [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3d018d7d] 的检索值 [org.springframework.orm.jpa.EntityManagerHolder@1028e769] 绑定到线程 [ http-nio-8443-exec-2] 23:51:43.214 调试 org.hibernate.jpa.spi.AbstractEntityManagerImpl - 将事务标记为回滚 23:51:43.215 TRACE org.springframework.transaction.interceptor.TransactionInterceptor - 在异常发生后完成 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.incrementLoginVersuche] 的事务:javax.persistence.TransactionRequiredException:执行更新/删除询问 23:51:43.217 TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - 应用规则来确定事务是否应在 javax.persistence.TransactionRequiredException 上回滚:执行更新/删除查询
UPDATE-3
TransactionManager 配置:
@Bean(name = "transactionManager")
public PlatformTransactionManager txManager() {
return new DataSourceTransactionManager(dataSource());
}
【问题讨论】:
标签: java spring spring-mvc spring-data