我正在尝试使用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()
创建此类实体的正确方法是什么?
您需要在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调用(