当前位置: 首页 > 知识库问答 >
问题:

Kotlin Hibernate JPA Lazy fetch无法通过控制器工作

萧德庸
2023-03-14

我在这里得到了一个完整的示例应用程序:https://github.com/MrMojoR/hibernateOnKotlin

这段代码基于这篇博客文章: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>()

PersonRepository:

import com.kotlinexpertise.hibernatedemo.model.Person
import org.springframework.data.jpa.repository.JpaRepository

interface PersonRepository : JpaRepository<Person, Long>

个人服务:

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)
    }
}

解决方案:

Spring Boot中的spring.jpa.open in view=true属性是什么?

此属性应设置为false:

spring.jpa.open-in-view=false

这不是科特林问题,而是Spring问题。

共有1个答案

闻人栋
2023-03-14

Lazy依赖于它具有可用的活动连接这一事实。

连接由Hibernate中的EntityManager管理。

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

 类似资料:
  • 我有一个JavaSpring Boot Application,我已经将服务器配置为在SSL上运行,这是强制性的。 我已经为我的域创建了一个证书从LetsEncrypt证书,并通过运行为keystore创建了一个p12文件 我想用Ingress Nginx控制器在Kubernetes上公开它,所以我创建了一个秘密 我已经部署了应用程序,可以看到部署文件,当我将本地8443端口转发到其服务的8443

  • 我已经安装并配置了AWS ALB入口控制器(https://github.com/kubernetes-sigs/aws-alb-ingress-controller),它可以通过HTTP正常工作。但是,它不能通过HTTPS解析。 入口资源如下: 我还按照此处的说明添加了自签名SSL证书: https://kubernetes.github.io/ingress-nginx/user-guide/

  • 我正在做一个项目,处理多个fxml和相应的控制器文件。我需要以某种方式从b.fxml的控制器访问定义在例如a.fxml中的fxml元素并使用它。 我不允许展示实际代码。但是,为此目的,我构建了一个简单的应用程序,其中包含两个FXML及其相应的控制器。 此应用程序具有带有ButtonController.java的Button.fxml和带有ProgressIndicator.fxml的Progre

  • 问题内容: 我正在尝试通过AngularJS将URL动态加载到iframe中。由于某种原因,我无法像这个小提琴那样显示。有人可以告诉我我在做什么错吗?为什么不能绑定到控制器中设置的URL?代码很小: 谢谢! 问题答案: 您的代码无法正常工作的原因是因为源不受信任。为了使来源受到信任,您需要使用本文推荐的服务。如果这样做,您将得到以下结果: HTML 控制者 请参阅更新的小提琴:http : //j

  • 问题内容: 我正在尝试使用AJAX将javascript对象(键值对)传递给MVC Controller操作。 控制器操作具有接收对象的Dictionary参数。 当有问题的对象为 空时 (意味着它在javascript中的值为{}),我在调试器中看到以下内容。 为什么控制器和动作名称会自动添加到Dictionary参数中? 使用提琴手,我能够看到正在传递到我的控制器,并且看不到这两个值正在传递.

  • 问题内容: 我为其中一个页面设置了一个版式,然后使用大量的小视图作为种子,这些小视图用于填充日期。我的状态目前看起来像这样: 如您所见,父布局将我的Controller保留在称为 EventCtrl 的页面上。现在,我希望所有视图现在都可以访问此控制器,但事实并非如此。相反,我必须将来自 eventLayout 的主要父模板包装到div中,然后在其中使用旧学校: 我至少想了解为什么会发生这种情况,