代码之家  ›  专栏  ›  技术社区  ›  sofs1 Romain Manni-Bucau

扩展一个基类和两个具有@Id注释的类是否会导致实体映射中的列重复?

  •  1
  • sofs1 Romain Manni-Bucau  · 技术社区  · 7 年前

    一个类扩展了另一个类。 这两个类都将在数据库中持久化。

    @Entity
    @Table(name="Questions")
    @Access(value = AccessType.FIELD)
    public class Questions implements Serializable {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        //@Access(value= AccessType.FIELD)
        private String q_Id;
    
        @Column(name="q_type")
        private String q_Type;
    
        @Column(name="q_lang")
        private String q_lang;
    
        @Access(value = AccessType.PROPERTY)
        public String getQ_Type() {
            return q_Type;
        }
    
        public void setQ_Type(String q_Type) {
            this.q_Type = q_Type;
        }
    
        @Id
        @Column(name="q_Id")
        @GeneratedValue(generator = "uuid2")
        @GenericGenerator(name = "uuid2", strategy = "uuid2")
        @Access(value = AccessType.PROPERTY)
        public String getQ_Id() {
            return q_Id;
        }
    
        public void setQ_Id(String q_Id) {
            this.q_Id = q_Id;
        }
    
        @Access(value = AccessType.PROPERTY)
        public String getQ_lang() {
            return q_lang;
        }
    
        public void setQ_lang(String q_lang) {
            this.q_lang = q_lang;
        }
    
    }
    

    英国电信级

    @Entity
    @Table(name="BT")
    @Access(value = AccessType.FIELD)
    public class BT extends Questions implements Serializable{
    
        private static final long serialVersionUID = 1L;
    
        @Access(value = AccessType.FIELD)
    //  @Id 
    //  @Column(name="q_Id")
        private String q_Id;
    
        @Access(value = AccessType.PROPERTY)
        public String getQ_Id() {
            return q_Id;
        }
    
        public void setQ_Id(String q_Id) {
            this.q_Id = q_Id;
        }
    
    //  @OneToOne(cascade = CascadeType.ALL)
    //  @PrimaryKeyJoinColumn
    //  @JoinColumn(name="q_id")
    //  @MapsId
        private Questions question;
    
        public Questions getQuestion() {
            return question;
        }
    
        public void setQuestion(Questions question) {
            this.question = question;
        }
    }
    

    我的一个用例是 问题和BT将分别保存到MySQL中相应的表中(问题表和BT表)。 这两个表都有一个主键Id,我的DAO类将首先在Questions表中插入,并为BT类使用相同的Id,BT类随后将插入BT表。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Minar Mahmud    7 年前

    扩展一个基类,该基类是 Entity

    你可以:

    • @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 以上是您用例的父类。

    提到 Section 2.11.4 in Hibernate-5.3.1.Final User Guide

    如果在父代和子代中需要不同的生成策略,则可以覆盖 getQ_Id() 方法,并实现该方法。