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

时间:2018-06-09 21:44:33

标签: java mysql hibernate hibernate-mapping

我有两节课。 一类扩展另一类。 这两个类都将保留在数据库中。 为什么我仍然得到:引起:org.hibernate.MappingException:实体映射中的重复列:com.ct.www.model.Bt列:q_Id(应使用insert =“false”update =“false”映射)

Questions.class

@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;
    }

}

BT.class

@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表)中的相应表中。 BT是一种问题。所以我决定扩展它。 两个表都有一个主键,它是Id,我的DAO类将首先插入到Questions表中,并为BT类使用相同的Id,后者将其插入到BT表中。

1 个答案:

答案 0 :(得分:1)

扩展Entity的基类会导致此问题。

你可以:

  • 从子类
  • 中删除公共映射字段/属性
  • 在您的用例的父类上方添加@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

有关示例代码,请参阅Section 2.11.4 in Hibernate-5.3.1.Final User Guide

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