当前位置: 首页 > 知识库问答 >
问题:

静态编程语言公开创建实体与参考

那昊
2023-03-14

我正在尝试使用Exposed on Kotlin编写CRUD服务。我有一张多对一的参考表。当我尝试插入时,我得到

Java语言lang.IllegalStateException:上下文中没有事务。

这是表和实体

object Contacts : IntIdTable("ph_contact"){
    var firstName = varchar("first_name",255)
    var lastName = varchar("last_name",255)
    var phone = varchar("phone",4096)
    var email = varchar("email",4096)
    var user = reference("user",Users)
}

class ContactEntity (id: EntityID<Int>): IntEntity(id){
    companion object : IntEntityClass<ContactEntity>(Contacts)

    var firstName by Contacts.firstName
    var lastName by Contacts.lastName
    var phone by Contacts.phone
    var email by Contacts.email
    var user by UserEntity referencedOn Contacts.user


    fun toContact() = Contact(id.value,user.id.value,firstName,lastName,phone,email)

}


data class Contact(
    val id: Int,
    val userId: Int,
    val firstName: String,
    val lastName: String,
    val phone: String,
    val email: String
)

下面是用于创建的服务方法

fun createContact(contact: Contact) = transaction {

        ContactEntity.new {

           this.firstName=contact.firstName
           this.lastName=contact.lastName
           this.phone=contact.phone
           this.email=contact.email
           this.user= UserEntity[contact.userId]

        }
    }

保存实体后调用toContact()方法时引发错误

var contact=contactEntity。toContact()

创建此类实体的正确方法是什么?

共有1个答案

元胡媚
2023-03-14

您需要在create方法的事务内部调用toContact方法。

只能从事务内部懒洋洋地访问记录的嵌套用户记录。

我通过让任何数据访问层接口使用我自己的数据类来实现这一点。暴露的记录和表在该层下保持私有。不要让事务实体泄漏到它上面。

下面的示例使用嵌套用户来说明:

object Users : IntIdTable("ph_users") {
    var otherUserData = varchar("other_user_data", 255)
}

class UserEntity(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<UserEntity>(Users)

    var otherUserData by Users.otherUserData


    fun toUser() = User(id.value, otherUserData)

}

object Contacts : IntIdTable("ph_contact") {
    var firstName = varchar("first_name", 255)
    var lastName = varchar("last_name", 255)
    var phone = varchar("phone", 4096)
    var email = varchar("email", 4096)
    var user = reference("user", Users)
}

class ContactEntity(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<ContactEntity>(Contacts)

    var firstName by Contacts.firstName
    var lastName by Contacts.lastName
    var phone by Contacts.phone
    var email by Contacts.email
    var user by UserEntity referencedOn Contacts.user

    fun toContact() = Contact(id.value, user.toUser(), firstName, lastName, phone, email)
}


data class Contact(
    val id: Int,
    val user: User,
    val firstName: String,
    val lastName: String,
    val phone: String,
    val email: String
)

data class User(
    val id: Int,
    val otherUserData: String
)

class ContactsRepo {

    fun createContact(contact: Contact): Contact = transaction {
        ContactEntity.new {
            this.firstName = contact.firstName
            this.lastName = contact.lastName
            this.phone = contact.phone
            this.email = contact.email
            this.user = UserEntity[contact.user.id]

        }.toContact()
    }

}

编辑:另一种选择是不让用户记录作为引用,而只是将其作为用户id保存?但在其他查询中可能需要此嵌套记录。

 类似资料:
  • > 如何将选择查询映射到类 是否有任何@transactional操作来执行查询?

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我有一个使用Kotlin 1.0版的Android项目。Android Studio中的0-beta-1038。 我可以在不同的部分使用Kotlin运行它,它在模拟器中编译并工作,但当我尝试使用ReadWriteProperty时,它会给出以下错误消息: 未解析的引用:ReadWriteProperty 类称为首选Utils.kt: build.grade(模块:app) build.grade(

  • 我希望函数位于类中(不污染全局名称空间),但可以静态访问(从不创建它们所在的对象)。提议的解决办法: 这是一个好的解决方案,还是不可避免地会创建一个对象?我应该使用哪种图案?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 考虑以下代码,我们获取列表的块,加入它们并打印到标准输出: 代码工作正常。我想更改lambda调用(