Hibernate OneToMany关联返回空列表

问题描述 投票:0回答:1

我正在尝试使OneToMany关联在Hibernate中正常工作,但是每当获得该值时,列表都是空的。我在下面的代码中重现了我的问题,并且不确定为什么未填充列表。

import io.dropwizard.hibernate.AbstractDAO
import io.dropwizard.testing.junit5.DAOTestExtension
import io.dropwizard.testing.junit5.DropwizardExtensionsSupport
import org.hibernate.SessionFactory
import org.hibernate.annotations.Fetch
import org.hibernate.annotations.FetchMode
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import java.io.Serializable
import java.util.*
import javax.persistence.*

@Entity
class One{
    @Id
    @GeneratedValue
    val id: Long = 0

    @OneToMany(mappedBy = "one", targetEntity = Many::class, cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    var many = Collections.emptyList<Many>()
}

@Entity
class Many{
    @Id
    @GeneratedValue
    val id: Long = 0

    @ManyToOne(cascade = [CascadeType.ALL])
    @JoinColumn(name = "one_Id")
    var one = One()
}

class OneDao(factory: SessionFactory): AbstractDAO<One>(factory){
    public override fun persist(entity: One): One {
        return super.persist(entity)
    }

    public override fun get(id: Serializable?): One {
        return super.get(id)
    }
}

class ManyDao(factory: SessionFactory): AbstractDAO<Many>(factory){
    public override fun persist(entity: Many): Many {
        return super.persist(entity)
    }

    public override fun get(id: Serializable?): Many {
        return super.get(id)
    }
}

@ExtendWith(DropwizardExtensionsSupport::class)
class OneToManyTest {
    val database: DAOTestExtension = DAOTestExtension.newBuilder()
        .addEntityClass(One::class.java)
        .addEntityClass(Many::class.java)
        .build()

    private val oneDao = OneDao(database.sessionFactory)
    private val manyDao = ManyDao(database.sessionFactory)

    @Test
    fun `one to many test`(){
        var one = One()
        oneDao.persist(one)

        var many = Many()
        many.one = one
        manyDao.persist(many)

        one = oneDao.get(one.id)//force refresh
        assertTrue(one.many.size > 0)//expecting this to pass because list size is 1, but it fails with size 0
    }
}

hibernate kotlin associations dropwizard
1个回答
0
投票

Kotlin在JPA上的工作效果不是很好,但是下一个示例应该对您有用

@Entity
data class One{
    @Id
    @GeneratedValue
    val id: Long = 0

) {
    @OneToMany(cascade = [CascadeType.ALL], mappedBy = "one")
    lateinit var many: List<Many>
}

@Entity(name = "many")
data class Many(
    @Id
    @GeneratedValue
    val id: Long,

    @ManyToOne(optional = false)
    @JoinColumn(name = "one_id")
    val one: One

)
© www.soinside.com 2019 - 2024. All rights reserved.