插入以将表 Spring JPA 与 Kotlin 连接起来



我的会员:

@Entity(name = "Members")
data class Member(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
@Column(unique = true)
@Basic
val uid: String,
@Column(unique = true)
@Basic val email: String,
@ManyToMany(fetch = FetchType.LAZY, cascade = [CascadeType.ALL])
@JoinTable(name = "groups_members")
@JsonIgnore
val groups: Collection<Group?> = ArrayList(),
@OneToMany(mappedBy = "member")
@JsonIgnore
val tasks: List<Task?> = ArrayList(),
@OneToMany(mappedBy = "creator")
@JsonIgnore
val createdTasks: List<Task?> = ArrayList(),
@OneToMany(mappedBy = "creator")
@JsonIgnore
val createdMeetings: List<Meeting?> = ArrayList(),
@OneToMany(mappedBy = "creator")
@JsonIgnore
val createdGroups: List<Group?> = ArrayList(),
@ManyToMany(fetch = FetchType.LAZY, cascade = [CascadeType.ALL])
@JoinTable(name = "meetings_members")
@JsonIgnore
val meetings: List<Meeting?> = ArrayList()
)

成员组的实体:

package com.kotlincoders.tmsapi.data
import com.fasterxml.jackson.annotation.JsonIgnore
import javax.persistence.*
@Entity(name = "team")
data class Group(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null,
@Column(unique = true, name = "name")
@Basic
val name: String,
@Basic
val description: String,
@ManyToMany(fetch = FetchType.LAZY, cascade = [CascadeType.ALL], mappedBy = "groups")
@JsonIgnore
val members: List<Member> = ArrayList(),
@OneToMany(mappedBy = "group")
@JsonIgnore
val tasks: List<Task> = ArrayList(),
@JsonIgnore
@ManyToOne val creator: Member
){
override fun toString(): String {
return "Group(id=${this.id},name=${this.name},description=${this.description})"
}
fun addMember(member: Member){
members.plus(member)
member.groups.plus(this)
}
}

控制器中的方法:

@PostMapping("/add/")
fun add(@RequestBody request: AddGroupRequest) {
val member = memberService.findByUid(request.creatorUid)
var group = Group(name = request.title, creator = member, description = request.description)
group.addMember(member)
groupService.save(group)
}

但是当我尝试将成员添加到组时,我没有任何例外,但没有插入任何内容来连接表,我不知道为什么。 组添加成功。 我对其他实体也有同样的问题,我尝试了很多方法来解决它,但没有任何效果。

这里的问题与延迟获取有关,要解决这个问题,请尝试使用 kotlinallOpen插件(更多信息在答案末尾的链接中(。

在 JPA 中使用数据类(带val(不是最佳选择,请阅读 spring 示例中的这句话:

在这里,我们不使用具有 val 属性的数据类,因为 JPA 不是为处理不可变类或数据类自动生成的方法而设计的。如果您使用的是其他 Spring Data 风格,它们中的大多数都旨在支持此类结构,因此在使用 Spring Data MongoDB、Spring Data JDBC 等时,您应该使用数据类 User(val login: String, ...( 等类。

https://github.com/spring-guides/tut-spring-boot-kotlin#persistence-with-jpa

最新更新