Kotlin Hibernate JPA懒惰未通过控制器工作



我在这里有一个完整的示例应用程序:https://github.com/mrmojor/hibernateonkotlin

此代码基于此Blogpost:https://kotlinexpertise.com/hibernate-with-kotlin-spring-boot/

问题是,尽管懒惰从集成测试完美地工作,但调试器中有一个例外:测试例外

当我从控制器中运行相同的代码时,也没有例外,整个实体被加载:控制器没有例外

怎么可能?非常感谢您的帮助!

我无论如何都会发布代码片段:

Abstractjpapersistable.kt

import org.springframework.data.domain.Persistable
import org.springframework.data.util.ProxyUtils
import java.io.Serializable
import javax.persistence.GeneratedValue
import javax.persistence.Id
import javax.persistence.MappedSuperclass
import javax.persistence.Transient
/**
 * Abstract base class for entities. Allows parameterization of id type, chooses auto-generation and implements
 * [equals] and [hashCode] based on that id.
 *
 * This class was inspired by [org.springframework.data.jpa.domain.AbstractPersistable], which is part of the Spring Data project.
 */
@MappedSuperclass
abstract class AbstractJpaPersistable<T : Serializable> : Persistable<T> {
    companion object {
        private val serialVersionUID = -5554308939380869754L
    }
    @Id
    @GeneratedValue
    private var id: T? = null
    override fun getId(): T? {
        return id
    }
    /**
     * Must be [Transient] in order to ensure that no JPA provider complains because of a missing setter.
     *
     * @see org.springframework.data.domain.Persistable.isNew
     */
    @Transient
    override fun isNew() = null == getId()
    override fun toString() = "Entity of type ${this.javaClass.name} with id: $id"
    override fun equals(other: Any?): Boolean {
        other ?: return false
        if (this === other) return true
        if (javaClass != ProxyUtils.getUserClass(other)) return false
        other as AbstractJpaPersistable<*>
        return if (null == this.getId()) false else this.getId() == other.getId()
    }
    override fun hashCode(): Int {
        return 31
    }
}

person.kt:

import javax.persistence.CascadeType
import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.ManyToOne
import javax.persistence.OneToMany    
@Entity
class Person(
        val name: String,
        @ManyToOne(cascade = [(CascadeType.ALL)], fetch = FetchType.EAGER)
        val street: Street
) : AbstractJpaPersistable<Long>()
@Entity
class Address(
        val zipCode: String,
        val city: String
) : AbstractJpaPersistable<Long>()
@Entity
class Street(
        @OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.LAZY)
        val adresses: MutableSet<Address>
) : AbstractJpaPersistable<Long>()

人格统治:

import com.kotlinexpertise.hibernatedemo.model.Person
import org.springframework.data.jpa.repository.JpaRepository
interface PersonRepository : JpaRepository<Person, Long>

PersonService:

import com.kotlinexpertise.hibernatedemo.model.Person
import com.kotlinexpertise.hibernatedemo.repository.PersonRepository
import org.springframework.stereotype.Service
@Service
class PersonService(val personRepository: PersonRepository) {
    fun savePerson(person: Person) {
        personRepository.saveAndFlush(person)
    }
}

解决方案:

今年春季是什么

此属性应设置为false:

spring.jpa.open-in-view=false

这不是Kotlin问题,而是春季问题。

懒惰依赖于它具有可用连接的事实。

连接由Hibernate的EntityManager管理。

但是您的调试器在完全不同的线程上运行,因此它无法访问EntityManager。因此例外。

最新更新