For a @ManyToOne
JPA 实体中的关系 我只对实际的 id 引用感兴趣,而不是获取与该关系关联的整个模型。
以这些 Kotlin JPA 实体为例:
@Entity
class Continent(
@Id
var id: String,
var code: String,
var name: String
) : Comparable<Continent> {
companion object {
private val COMPARATOR = compareBy<Continent> { it.id }
}
override fun compareTo(other: Continent): Int {
return COMPARATOR.compare(this, other)
}
}
@Entity
class Country(
@Id
var id: String,
var alpha2Code: String,
var alpha3Code: String,
var name: String,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "continent_id")
var continent: Continent
) : Comparable<Country> {
companion object {
private val COMPARATOR = compareBy<Country> { it.id }
}
override fun compareTo(other: Country): Int {
return COMPARATOR.compare(this, other)
}
}
现在当我访问country.continent.id
从我的 Kotlin 代码中可以看到完整的Continent
实际上是从数据库中查询出来的。
这太过分了,因为我只对Continent.id
.
我尝试过添加@Access(AccessType.PROPERTY)
like:
@Entity
class Continent(
@Id
@Access(AccessType.PROPERTY)
var id: String,
但这没有什么区别。整体Continent
仍然从数据库中查询。
我尝试过@Access(AccessType.PROPERTY)
正如其他帖子中提到的那样(例如Hibernate 一对一: getId() 而不获取整个对象),但我已经注意到对此的反馈意见不一。
我正在使用休眠5.3.7.Final
与科特林1.3.0
.
我怀疑是否1) the @Access(AccessType.PROPERTY)
方法是正确的并且2)这也应该与 Kotlin 一起使用吗?也许 Kotlin 生成 Java 代码的方式导致了问题?
UPDATE
我创建了一个简单的测试项目,证明该大陆正在被查询。https://github.com/marceloverdijk/hibernate-proxy-id
该项目包含一个简单的测试检索country.continent.id
并且 SQL 日志记录已启用。从伐木可以看到大陆is询问。
UPDATE 2
我已经创建了https://youtrack.jetbrains.net/issue/KT-28525为了这。