列表不为空时不调用字段设置器

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。

【讨论】:

以上是关于列表不为空时不调用字段设置器的主要内容,如果未能解决你的问题,请参考以下文章

字段为空时不触发远程属性

仅在不为空时比较字段

当字段不为空时,需要Codeigniter验证显示事件

MongoDb 仅当数组不为空时才在数组中添加字段

Laravel 验证仅在字段不为空时验证正则表达式

SwiftUI:仅当输入不为空时才启用保存按钮