Hibernate Kotlin、JPA和@Transient
我有一个从Java迁移到Kotlin的实体类。inetAddress的一个属性用@Transient注释,以防止它被持久化到关系数据库中。但是,JPA Hibernate实现没有看到此注释,而是将其作为自己的字段放在数据库中。当用Java编写类时,这一切都能正常工作 有人知道如何正确注释这个Kotlin类,以便JPA/Hibernate能够看到@Transient注释,而不是将inetAddress属性放在数据库中吗Hibernate Kotlin、JPA和@Transient,hibernate,jpa-2.0,kotlin,Hibernate,Jpa 2.0,Kotlin,我有一个从Java迁移到Kotlin的实体类。inetAddress的一个属性用@Transient注释,以防止它被持久化到关系数据库中。但是,JPA Hibernate实现没有看到此注释,而是将其作为自己的字段放在数据库中。当用Java编写类时,这一切都能正常工作 有人知道如何正确注释这个Kotlin类,以便JPA/Hibernate能够看到@Transient注释,而不是将inetAddress属性放在数据库中吗 package infr.audio.model import com.fa
package infr.audio.model
import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonProperty
import infr.audio.messages.InetAddressWrapper
import java.io.Serializable
import java.net.InetAddress
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id
import javax.persistence.NamedQueries
import javax.persistence.NamedQuery
import javax.persistence.Table
@Entity
@Table(name = "DIS_JOCKEY")
@NamedQueries(NamedQuery(name = "DisJockeyInfo.find", query = "SELECT m FROM DisJockeyInfo m"), NamedQuery(name = "DisJockeyInfo.findByReservationId", query = "SELECT m FROM DisJockeyInfo m WHERE m.reservationId = :reservationId"), NamedQuery(name = "DisJockeyInfo.findByReservationIdAndName", query = "SELECT m FROM DisJockeyInfo m WHERE m.reservationId = :reservationId AND m.name = :name"), NamedQuery(name = "DisJockeyInfo.findMaxDisEntityIdByReservationId", query = "SELECT MAX(m.disEntityId) FROM DisJockeyInfo m WHERE m.reservationId = :reservationId"), NamedQuery(name = "DisJockeyInfo.findActive", query = "SELECT m FROM DisJockeyInfo m WHERE m.disEntityId IS NOT NULL"), NamedQuery(name = "DisJockeyInfo.findActiveByInetAddress", query = "SELECT m FROM DisJockeyInfo m WHERE m.inetAddress = :inetAddress AND m.disEntityId IS NOT NULL"), NamedQuery(name = "DisJockeyInfo.findActiveByReservationId", query = "SELECT m FROM DisJockeyInfo m WHERE m.reservationId = :reservationId AND m.disEntityId IS NOT NULL"), NamedQuery(name = "DisJockeyInfo.deleteInactive", query = "DELETE FROM DisJockeyInfo m WHERE m.id = :id AND m.disEntityId IS NULL"))
data class DisJockeyInfo(
@get:Id
@get:GeneratedValue(strategy = GenerationType.IDENTITY)
@get:Column(name = "ID")
var id: Long,
@get:Column(name = "RESERVATION_ID")
var reservationId: String?,
@get:Column(name = "NAME")
var name: String?,
@get:Column(name = "DIS_ENTITY_ID")
var disEntityId: Long?,
@get:java.beans.Transient
@get:JsonIgnore
@field:Transient
var inetAddress: InetAddress?
) : GenericEntity, Serializable {
var inetAddressString: String?
@Column(name = "INET_ADDRESS")
@JsonProperty("inetAddress")
get() = if (inetAddress != null) InetAddressWrapper(inetAddress).encodedInetAddress else null
set(inetAddressString) {
inetAddress = if (inetAddressString != null) InetAddressWrapper(inetAddressString).inetAddress else null
}
constructor() : this(id = 0L, reservationId = null, name = null, disEntityId = null, inetAddress = null) {}
companion object {
/** Serial version */
private val serialVersionUID = 2027355982760360935L
}
}
您正在注释字段,而不是注释getter。请注意,getter注释使用了不正确的类型java.beans.Transient,而不是正确的javax.persistence.Transient。您正在注释字段,而不是注释getter。请注意,您的getter注释使用了不正确的类型java.beans.Transient,而不是正确的javax.persistence.Transient。只需添加:
import javax.persistence.Transient
只需添加:
import javax.persistence.Transient
您正在注释字段,而不是注释getter。我已经很久没有使用Kotlin了,但我相信我在字段和getter上都添加了@Transient注释:@get:java.beans.Transient。这就是@get:部分的意思,不是吗?除非正确的注释不是java.beans.Transient,而是javax.persistence.TransientYes!非常感谢。这就是答案-如果你把它作为一个答案,我会接受并投票。你是在注释字段而不是注释getter。我已经很久没有使用Kotlin了,但我相信我在字段和getter上都添加了@Transient注释:@get:java.beans.Transient。这就是@get:部分的意思,不是吗?除非正确的注释不是java.beans.Transient,而是javax.persistence.TransientYes!非常感谢。这就是答案——如果你把它作为一个答案,我会接受并投票表决。