我正在尝试使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
}
}
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
)