我有以下对象(简化):

@Entity 
@Table(name = "delivery_addresses") 
data class DeliveryAddress ( 
        val street: String 
) { 
 
    @ManyToOne(fetch=FetchType.LAZY) 
    lateinit var user: User 
} 

当我通过 ID 查询对象时
val deliveryAddress = deliveryAddressService.findById(1) 

哪个

override fun findById(deliveryAddressId: Long): DeliveryAddress? { 
    return deliveryAddressRepository.findById(deliveryAddressId).orElse(null) // JpaRepository 
} 

我可以看到执行了以下查询:

select deliveryad0_.street as street6_2_0_, deliveryad0_.user_id as user_id8_2_0_, from delivery_addresses deliveryad0_ where deliveryad0_.id=? 
 
select user0_.id as id1_5_0_, user0_.email as email2_5_0_, user0_.password as password3_5_0_, where user0_.id=? 

我该如何制作 FetchType.LAZY异常(exception)工作(还有 @Basic(fetch = FetchType.LAZY )对我不起作用)?

请您参考如下方法:

最后我能够弄清楚。该问题与 kotlin 数据类有关(请参阅 KT-28525)

不应将数据类与 spring-data-jpa 一起使用。引用自 kotlin spring-guide

Here we don’t use data classes with val properties because JPA is not designed to work with immutable classes or the methods generated automatically by data classes. If you are using other Spring Data flavor, most of them are designed to support such constructs so you should use classes like data class User(val login: String, …​) when using Spring Data MongoDB, Spring Data JDBC, etc.



为了使延迟获取按预期工作,实体应该是开放的。我的解决方案:

build.gradle.kts:
plugins { 
  kotlin("plugin.allopen") version "1.3.61" 
} 
 
allOpen { 
  annotation("javax.persistence.Entity") 
  annotation("javax.persistence.Embeddable") 
  annotation("javax.persistence.MappedSuperclass") 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!