微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hibernate Transient 在 Kotlin 中不起作用

如何解决Hibernate Transient 在 Kotlin 中不起作用

编辑:添加了整个堆栈跟踪

我有一个“DGGuild”类,表中有几个字段。
我还有一个不应出现在数据库表中的@Transient 字段。

但是由于我添加了 @Transient 注释,它崩溃并显示以下错误

org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123)
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
    at org.hibernate.metamodel.internal.metamodelImpl.initialize(metamodelImpl.java:181)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:301)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
    at eu.dragoncoding.dragonbot.hibernate.HibernateUtils.createSessionFactory(HibernateUtils.kt:75)
    at eu.dragoncoding.dragonbot.hibernate.HibernateUtils.getSessFactory(HibernateUtils.kt:45)
    at eu.dragoncoding.dragonbot.hibernate.HibernateUtils.<clinit>(HibernateUtils.kt:27)
    at eu.dragoncoding.dragonbot.Bot.startUp(Bot.kt:49)
    at eu.dragoncoding.dragonbot.Main.main(Main.kt:19)
Caused by: org.hibernate.InstantiationException: Could not instantiate test object : eu.dragoncoding.dragonbot.hibernate.entities.DGuild
    at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:43)
    at org.hibernate.engine.internal.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:68)
    at org.hibernate.tuple.PropertyFactory.buildIdentifierAttribute(PropertyFactory.java:63)
    at org.hibernate.tuple.entity.Entitymetamodel.<init>(Entitymetamodel.java:140)
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:609)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:128)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)
    ... 10 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:40)
    ... 21 common frames omitted
Caused by: java.lang.NullPointerException: null
    at eu.dragoncoding.dragonbot.managers.music.GuildMusicController.<init>(GuildMusicController.kt:14)
    at eu.dragoncoding.dragonbot.hibernate.entities.DGuild.<init>(DGuild.kt:37)
    ... 27 common frames omitted

我的班级是这样的:

import eu.dragoncoding.dragonbot.defaultChannelID
import eu.dragoncoding.dragonbot.defaultPrefix
import eu.dragoncoding.dragonbot.hibernate.EntityDao
import eu.dragoncoding.dragonbot.managers.GuildManager.removeGuild
import eu.dragoncoding.dragonbot.managers.music.GuildMusicController
import lombok.Data
import lombok.NoArgsConstructor
import org.slf4j.LoggerFactory
import javax.persistence.*

@Entity
@Data
@NoArgsConstructor
@Table(name = "Guilds")

class DGuild: eu.dragoncoding.dragonbot.structures.Entity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID",nullable = false)
    val id: Long = 0

    @Column(name = "guildID",nullable = false)
    var guildID: Long = defaultChannelID
    @Column(name = "prefix",nullable = false)
    var prefix: String = defaultPrefix
    @Column(name = "isJoined",nullable = false)
    var isJoined: Boolean = true
    @Column(name = "botChannelID",nullable = false)
    var botChannelID: Long = defaultChannelID
    @Column(name = "commandsUsed",nullable = false)
    var commandsUsed: Int = 0

    @Transient
    val musicManager: GuildMusicController = GuildMusicController(this)

    constructor(guild_ID: Long) {
        this.guildID = guild_ID
    }
    constructor()

    fun save() {
        EntityDao.save(this)
    }
    fun update() {
        EntityDao.update(this)
    }

    fun activate() {
        if (!isJoined) {
            isJoined = true
            update()
        }
    }
    fun deactivate() {
        if (isJoined) {
            isJoined = false
            update()
            removeGuild(guildID)
        }
    }

    fun incrementCommands() {
        this.commandsUsed += 1
        update()
    }


}

我尝试将@Transient 应用于@field:、@get: 和@set:
我还使该类可序列化。

当我删除字段和注释时,它工作正常。

解决方法

我在初始化时犯了一个大错误...
我为一个不允许的构造函数提供了一个空值。

这发生在“val musicManager: GuildMusicController = GuildMusicController(this)”行中,我想在 GuildMusicController 的构造函数中使用 DGuild 对象。问题是它还没有初始化(因为它仍然需要 GuildMusicController 对象),所以它仍然为 null。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。