Spring Data Hibernate сохранить молча не удается - PullRequest
0 голосов
/ 01 июля 2018

У меня есть приложение весенней загрузки с spring-boot-data-jpa.

Все отлично работает: управление сессиями, управление учетными записями, отношения между этими объектами и т. Д. *

Я хочу добавить новый объект для регистрации действий учетной записи для пользователей, но как только я пытаюсь его сохранить, это не так. Имейте в виду, что все остальные дао из весенней сессии и работы по управлению учетными записями реализованы одинаково. (Весенняя сессия - автоматическая реализация.

@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 несмотря на отчет, ясно показывающий, что транзакция в настоящее время загружена. Может быть, это ключ к проблеме.

UPDATE:

Я нашел случай, который работает с этим точным кодом. Просто запустите это традиционный уровень конечной точки / сервиса. Проблема определенно связана с доступом к базе данных из обработчиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...