postgresql - Spring Data Hibernate 静默保存失败
问题描述
我有一个带有 spring-boot-data-jpa 的 spring boot 应用程序。
一切正常:会话管理、帐户管理、这些对象之间的关系等......
我想添加一个新实体来记录用户的帐户操作,但是一旦我尝试保存它,它就没有。请记住 spring 会话和帐户管理工作中的所有其他 dao,并以相同的方式实现。(春季会议一是自动实施。
@Entity
@Table(indexes = [Index(columnList = "username")])
open class Event {
@Id
@GeneratedValue
var id: UUID? = null
@Enumerated(EnumType.STRING)
lateinit var type: EventType
var username: String = ""
var addr: String = ""
var port: Int = 0
var date: Date = Date()
}
enum class EventType {
LOGIN, LOGOUT, LOGIN_FAIL, CERT_GEN
}
存储库:
@Repository
interface EventRepository: JpaRepository<Event, UUID>
服务:
interface IEventService {
fun onLogin(request: HttpServletRequest, username: String)
fun onLogout(request: HttpServletRequest, username: String)
fun onLoginFail(request: HttpServletRequest, username: String)
fun onCert(request: HttpServletRequest, username: String)
}
暗示:
@Service
@Transactional
open class EventService : IEventService {
@Autowired
private lateinit var eventRepository: EventRepository
override fun onLogin(request: HttpServletRequest, username: String) {
val evt = Event()
evt.addr = request.remoteAddr
evt.port = request.remotePort
evt.username = username
evt.type = EventType.LOGIN
eventRepository.save(evt)
}
... same with different EventType
这是来自事务和休眠的事务的跟踪日志。
2018-07-01 14:59:06.685 TRACE 3128 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor : Getting transaction for [com.acme.services.impl.EventService.onLogout]
2018-07-01 14:59:06.685 TRACE 3128 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2018-07-01 14:59:06.685 TRACE 3128 --- [nio-8080-exec-3] .i.SessionFactoryImpl$SessionBuilderImpl : Opening Hibernate Session. tenant=null, owner=org.hibernate.jpa.internal.EntityManagerImpl@7f512e36
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] org.hibernate.internal.SessionImpl : Opened session at timestamp: 15304499466
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] org.hibernate.internal.SessionImpl : Setting flush mode to: AUTO
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] org.hibernate.internal.SessionImpl : Setting cache mode to: NORMAL
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.h.e.i.AbstractSaveEventListener : Transient instance of: com.acme.dbo.Event
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.h.e.i.DefaultPersistEventListener : Saving transient instance
2018-07-01 14:59:06.686 DEBUG 3128 --- [nio-8080-exec-3] o.h.e.i.AbstractSaveEventListener : Generated identifier: b3619aa5-af5c-4552-a092-187d0d16e94b, using strategy: org.hibernate.id.UUIDGenerator
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.h.e.i.AbstractSaveEventListener : Saving [com.acme.dbo.Event#b3619aa5-af5c-4552-a092-187d0d16e94b]
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] org.hibernate.engine.spi.ActionQueue : Adding an EntityInsertAction for [com.acme.dbo.Event] object
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] org.hibernate.engine.spi.ActionQueue : Adding insert with no non-nullable, transient entities: [EntityInsertAction[com.acme.dbo.Event#b3619aa5-af5c-4552-a092-187d0d16e94b]]
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] org.hibernate.engine.spi.ActionQueue : Adding resolved non-early insert action.
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor : Completing transaction for [com.acme.services.impl.EventService.onLogout]
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] org.hibernate.internal.SessionImpl : Closing session
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.h.e.jdbc.internal.JdbcCoordinatorImpl : Closing JDBC container [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl@14babdc8]
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing JDBC resources
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.h.r.j.i.LogicalConnectionManagedImpl : Closing logical connection
2018-07-01 14:59:06.686 TRACE 3128 --- [nio-8080-exec-3] o.h.r.j.i.LogicalConnectionManagedImpl : Logical connection closed
2018-07-01 14:59:06.699 TRACE 3128 --- [nio-8080-exec-5] .i.SessionFactoryImpl$SessionBuilderImpl : Opening Hibernate Session. tenant=null, owner=org.hibernate.jpa.internal.EntityManagerImpl@15a4558c
2018-07-01 14:59:06.699 TRACE 3128 --- [nio-8080-exec-5] org.hibernate.internal.SessionImpl : Opened session at timestamp: 15304499466
2018-07-01 14:59:06.699 TRACE 3128 --- [nio-8080-exec-5] org.hibernate.internal.SessionImpl : Setting flush mode to: AUTO
2018-07-01 14:59:06.699 TRACE 3128 --- [nio-8080-exec-5] org.hibernate.internal.SessionImpl : Setting cache mode to: NORMAL
2018-07-01 14:59:06.747 TRACE 3128 --- [nio-8080-exec-5] org.hibernate.internal.SessionImpl : Closing session
2018-07-01 14:59:06.747 TRACE 3128 --- [nio-8080-exec-5] o.h.e.jdbc.internal.JdbcCoordinatorImpl : Closing JDBC container [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl@610769c]
2018-07-01 14:59:06.747 TRACE 3128 --- [nio-8080-exec-5] o.h.r.j.i.ResourceRegistryStandardImpl : Releasing JDBC resources
2018-07-01 14:59:06.747 TRACE 3128 --- [nio-8080-exec-5] o.h.r.j.i.LogicalConnectionManagedImpl : Closing logical connection
2018-07-01 14:59:06.747 TRACE 3128 --- [nio-8080-exec-5] o.h.r.j.i.LogicalConnectionManagedImpl : Logical connection closed
我在像这样的处理程序中使用这些服务,添加到 HttpSecurity 中http.logout().addLogoutHandler(logoutHandler)
:
@Component
open class AcmeLogoutHandler : LogoutHandler {
@Autowired
private lateinit var service: IEventService
override fun logout(request: HttpServletRequest, response: HttpServletResponse, authentication: Authentication?) {
service.onLogout(request, authentication?.name ?: "")
}
}
我非常绝望地试图弄清楚这个......没有错误,但它不起作用,我尝试做的任何事情似乎都失败了。
一件值得注意的事情是,当我使用它eventRepository.saveAndFlush(evt)
而不是它时,
尽管日志清楚地显示当前已加载事务,但eventRepository.save(evt)
它会抛出一个。javax.persistence.TransactionRequiredException: no transaction is in progress
也许这就是问题的关键。
更新:
我找到了一个适用于该确切代码的案例。只需运行它就是传统的端点/服务层。问题肯定是从处理程序访问数据库。
解决方案
推荐阅读
- python - 在 Python matplotlib 中添加图例
- html - 仅在 Web 动画期间才考虑 60FPS 吗?
- fortran - 在数组 fortran 中查找非零元素的索引
- c++ - 线程彼此减慢
- javascript - 在 .env 文件中读取导出的变量 nodejs
- css - 阻止 @import CSS 的页面渲染
- python - 警告 conda.gateways.disk:unlink_or_rename_to_trash(140)
- php - 当我将 PHP 代码发送到 Laravel 函数的请求中时,403 被禁止
- python-3.x - 如何从每个索引多个项目的列表中创建一个每个索引一个项目的列表
- c# - Powershell 气球通知在显示前消失