【问题标题】:Hibernate - Extending Entities without a base table annotation?Hibernate - 扩展没有基表注释的实体?
【发布时间】:2022-01-22 18:42:00
【问题描述】:

我有以下 2 个Hiberante 实体:

Person

Animal 

它们具有共享字段/列,例如:name, age 等,但是每个主键 id 字段的名称不同,例如有person_idanimal_id

@Entity
@Table(name = "person")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person{
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty
    @Column(name = "person_id")
    private Integer person_id;

    // all below fields are generic in all the entities
    @JsonProperty
    @Column(name = "name")
    private String name;

    @JsonProperty
    @Column(name = "age")
    private String age;

}

有没有一种方法可以创建一个基础实体超类来保存这些通用 name, age 等字段,然后让 Person、Animal 和任何新实体扩展这个超实体?

请注意,超类没有自己的表,所以我不确定@Table 的值是什么?

我也有主键没有被命名的问题,例如id 所以必须在每个实体中具体指定它们。

【问题讨论】:

    标签: java hibernate inheritance superclass


    【解决方案1】:

    如果你不想在你的数据库中为这个“超级实体”添加一个表(让我们称之为类Being),你仍然可以让PersonAnimal继承它(Person应该继承自Animal BTW),并在属性上映射公共字段:

    public abstract class Being {
        private Integer id;
        private String name;
    
        // ...
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        //...
    }
    
    @Entity
    @Table(name = "person")
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Person extends Being {
        
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @JsonProperty
        @Column(name = "person_id")
        public Integer getId() {
            return super.getId();
        }
    
        public void setId(Integer id) {
            super.setId(id);
        }
    
        // all below fields are generic in all the entities
        @JsonProperty
        @Column(name = "name")
        public String getName() {
            return super.getName();
        }
    
        public void setName(String name) {
            super.setName(name);
        }
    
        //...
    
    }
    

    【讨论】:

    • 谢谢 这是否在某种程度上脱离了抽象类的意义?我仍然需要为每个子对象中的通用字段创建 getter 和 setter 吗?另外,我不明白为什么有人会在他们的数据库中有一张桌子,因为这只会在人或动物身上重复?
    • @java12399900 是的。 Being 类不必是 abstract,但不会保留实例。为高级类创建一个表是有意义的,即使它是抽象的,以便在 Java 类和 SQL 表之间有更好的映射,并减少冗余字段/列(并避免添加冗余的 getter/setter)。
    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 2010-09-21
    • 1970-01-01
    • 2013-03-08
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多