我有一个Spring Boot 2 + Hibernate + Kotlin项目。
我正在尝试将具有@Embeddable
的实体映射为Kotlin data
类。嵌入式包含2个标准字段和一个单向多对多集合:
@Entity
data class CampaignPlatform(
@Id
val id: Long,
var name: String,
var targetAudience: TargetAudience
)
@Embeddable
data class TargetAudience(var ageRangeFrom: Int, var ageRangeTo: Int) {
@ManyToMany(cascade = [CascadeType.ALL])
var countries = mutableListOf<Country>()
}
创建,填充和保存实体时,该实体会正常保存,但是无论我做什么,countries
集合始终为空(不理会它,添加国家/地区)或将其替换为另一个包含国家/地区的列表),则多对多联接表中不会保留任何内容。没有记录异常。
请注意,我使用了Hibernate DDL模式创建,并且确实创建了多对多联接表。但是没有插入任何内容。
但是,如果我将类修改为非数据类并将所有属性移到类的主体上,则它将按预期工作:
@Embeddable
class TargetAudience {
var ageRangeFrom: Int = -1
var ageRangeTo: Int = -1
@ManyToMany(cascade = [CascadeType.ALL])
var countries = mutableListOf<Country>()
}
正在发生什么,如何使它与data
类一起工作?
更新:
实际上,确定我是否工作的因素是@Embedded
类中是否有构造函数,无论它是否为data
类。当然,data
类必须必须具有构造函数。
我已经使用jpa
Kotlin编译器插件为我的实体生成默认的(空)构造函数(并假设它也对可嵌入对象使用)。