英文:
In Spring Boot, how do you set a (extended) property using extended setters and getters?
问题
以下是翻译好的内容:
我正在使用Spring Boot,并且有以下实体定义(已删节):
package com.vw.asa.entities;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.PreUpdate;
import javax.validation.constraints.NotNull;
public abstract class CmsModel extends Model {
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "is_active")
    private short isActive;
    
    
    public short getIsActive() {
        return isActive;
    }
    
    public void setIsActive(short isActive) {
        this.isActive = isActive;
    }
    
    public void setIsActive(String isActive) {
        if (isActive.equals("true")) {
            this.isActive = IS_TRUE;
        } else if (isActive.equals("1")) {
            this.isActive = IS_TRUE;
        } else {
            this.isActive = IS_FALSE;
        }
    }
} 
然后我有几个模型扩展了这个“基础”模型,遵循以下结构:
package com.vw.asa.entities.cms;
import com.vw.asa.entities.CmsModel;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.List;
@Entity
@Table(name = "cms_extra_questions", schema = "asa")
public class CmsExtraQuestions extends CmsModel {
        
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    
    ...
}
当我通过Hibernate查询初始化CmsExtraQuestions的实例时,如果在对象上调用setActive(true),它不会对该对象的成员属性产生影响。当我将CmsModel基类中的setter和getter复制到CmsExtraQuestions类中时,它可以正常工作。
$entity = new CmsExtraQuestions();
$entity->setActive(true);
为什么在调用扩展的setter时,这不会设置实例化对象的成员属性?如果这是正常的,是否有一种方法可以将这些属性和成员函数添加到基础模型中,使它们也能被继承?
英文:
I am using Spring Boot, and have the following Entity definitions (abridged):
package com.vw.asa.entities;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.PreUpdate;
import javax.validation.constraints.NotNull;
public abstract class CmsModel extends Model {
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "is_active")
    private short isActive;
    
    
    public short getIsActive() {
        return isActive;
    }
    
    public void setIsActive(short isActive) {
        this.isActive = isActive;
    }
    
    public void setIsActive(String isActive) {
        if (isActive.equals("true")) {
            this.isActive = IS_TRUE;
        } else if (isActive.equals("1")) {
            this.isActive = IS_TRUE;
        } else {
            this.isActive = IS_FALSE;
        }
    }
} 
Then I have several models which extend this 'base' model, following this flavor:
package com.vw.asa.entities.cms;
import com.vw.asa.entities.CmsModel;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.List;
/**
 * @author Barry Chapman
 */
@Entity
@Table(name = "cms_extra_questions", schema = "asa")
public class CmsExtraQuestions extends CmsModel {
        
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    
    ...
}
When I initialize an instance of CmsExtraQuestions as a result of a hibernate query, if I call setActive(true) on the object, it has no effect on the members of that object. When I copy the setters and getters from the CmsModel base class into the CmsExtraQuestions class, it works fine.
$entity = new CmsExtraQuestions();
$entity->setActive(true);
Why does this not set the member properties of the instantiated object when calling the extended setter? If this is normal - is there a way to add these properties and member functions to the base model so that they can be inherited also?
答案1
得分: 0
以下是您要的翻译内容:
新手错误,我忘记给继承的模型CmsModel添加@MappedSuperClass注解。这允许JPA将该类的属性映射,就好像它们是在继承该基类的模型中定义的一样。
@MappedSuperclass
public abstract class CmsModel extends Model {
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "is_active")
英文:
Rookie mistake, I forgot to add @MappedSuperClass to the inherited model, CmsModel. That allows JPA to map the properties from that class as though they were defined in the model that was inheriting that base class.
@MappedSuperClass
public abstract class CmsModel extends Model {
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "is_active")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论