列表不为空时不调用字段设置器
Posted
技术标签:
【中文标题】列表不为空时不调用字段设置器【英文标题】:Field setter not called when list is not empty 【发布时间】:2022-01-14 17:24:42 【问题描述】:我有一个包含子实体列表的父实体。我使用的是Spring Data Rest
,所以没有自定义控制器。
这些是我的实体:
@Entity
class Template(
childComponents: MutableList<AbstractLabelComponent> = mutableListOf(),
)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
var id: Long? = null
@JsonManagedReference
@OneToMany(mappedBy = "template", cascade = [CascadeType.ALL], orphanRemoval = true)
private var components: MutableList<AbstractLabelComponent> = childComponents
set(value)
field.clear()
field.addAll(value)
field.forEach it.template = this
fun addComponent(component: AbstractLabelComponent)
component.template = this
this.components.add(component)
还有子类:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(
JsonSubTypes.Type(value = TextComponent::class, name = TextComponent.TYPE),
JsonSubTypes.Type(value = TextAreaComponent::class, name = TextAreaComponent.TYPE),
JsonSubTypes.Type(value = ImageComponent::class, name = ImageComponent.TYPE)
)
abstract class AbstractLabelComponent(
@field:ManyToOne
@field:JsonBackReference
@field:JoinColumn(name="template_id")
open var template: Template?
)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
open var id: Long? = null
这是我发布到 API 的 json:
"components": [
"id": 2300,
,
"id": 2302,
],
"id": 1789
我留下了一些简单的字段以使其更具可读性。我没有组件存储库,模板存储库除了扩展基本的 crud 存储库之外没有任何代码。
起初,子组件的创建没有任何问题,但没有设置 template_id
字段。这就是我为components
字段创建setter 来设置模板的原因。当我将组件添加到没有组件的模板时,这可以正常工作,但是我注意到当我尝试添加更多组件时,它们最终再次没有模板 ID。
我在 setter 中添加了一个断点,结果它没有被调用。我想可能是因为如果列表不为空,JPA 不会设置列表而是向其中添加元素。我对吗?如果是这样,有没有办法告诉它使用 addComponent 方法,以便我可以设置模板?或者任何其他方式来确保设置了对模板的引用?
【问题讨论】:
【参考方案1】:事实证明,这两种情况之间的区别不是数据库中存在的组件数量,而是实体是否有任何更改。不确定,但如果没有更改,JPA 似乎不会保留实体,并且可能也不会打扰设置此类关系。可能有更好的解决方案,但解决方法是如果实体不是新实体,则从前端在 JSON 中设置模板 ID。
【讨论】:
以上是关于列表不为空时不调用字段设置器的主要内容,如果未能解决你的问题,请参考以下文章