![](/img/trans.png)
[英]javax.persistence.RollbackException: Error while committing the transaction
[英]javax.persistence.RollbackException: Error while committing the transaction] with root cause java.lang.StackOverflowError: null
我有一個使用Spring Data REST框架的Spring Boot API(繼承自spring-boot-starter-parent 2.1.0.RELEASE的依賴項)。 我正在嘗試執行PUT或PATCH請求更新實體,似乎都不起作用,拋出以下錯誤消息:
[請求處理失敗; 嵌套異常是org.springframework.transaction.TransactionSystemException:無法提交JPA事務; 嵌套異常是javax.persistence.RollbackException:使用根目錄提交事務時出錯] java.lang.StackOverflowError:null
我想要更新的實體具有以下結構:
@Getter
@Setter
@Entity
@Table(name = "entity_a")
public class EntityA extends BaseEntity {
@Column(name = "name", nullable = false, length = 100)
private String name
@OneToMany(mappedBy = "entityA")
private Set<EntityB> entitiesB;
}
其中BaseEntity具有ID和審核信息。
我正在對以下路徑發出PUT / PATCH請求:
身體有效負載為
{“name”:“新名稱”}
由於這是一個堆棧溢出錯誤,我的第一個想法是遞歸正在發生的事情。 我注釋掉了Set <EntityB>字段(以及@OneToMany注釋),但我仍然遇到了錯誤。 之前有沒有人遇到過此錯誤?
問題與我實現AuditorAware <T>接口的方式有關。 我正在使用的userDao方法導致遞歸調用。 我仍然不知道為什么會這樣,但是看看這個論壇 ,我改變了getCurrentAuditor()的實現:
@Override
public Optional<User> getCurrentAuditor() {
String username = SecurityContextHolder.getContext().getAuthentication().getName();
User user = userDao.findByUsername(username);
return Optional.ofNullable(user);
}
至:
@Override
public Optional<User> getCurrentAuditor() {
User auditor = null;
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
Object principal = authentication.getPrincipal();
if (principal instanceof User) {
auditor = (User) principal;
}
}
return Optional.ofNullable(auditor);
}
一切都按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.