Hibernate 认为子实体字段属于父实体

Hibernate thinks that child entity fields belong to parent

我有多个子实体使用的公共实体:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class CommonEntity {
    @Id
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

@Entity
public class FirstChild extends CommonEntity {
    private String firstChildField;

    public String getFirstChildField() {
        return firstChildField;
    }

    public void setFirstChildField(String firstChildField) {
        this.firstChildField = firstChildField;
    }
}

@Entity
public class SecondChild extends CommonEntity {
    private String secondChildField;

    public String getSecondChildField() {
        return secondChildField;
    }

    public void setSecondChildField(String secondChildField) {
        this.secondChildField= secondChildField;
    }
}

CommonEntityFirstChildSecondChild 都是独立的 table,CommonEntity.id 连接到 FirstChild.idSecondChild.id.

当尝试从数据库加载 FirstChild 时,select CommonEntity 字段的 HQL 认为 firstChildField 是 table 的一部分,尽管它是 FirstChild table.

的一部分

当尝试从数据库加载 SecondChild 时,select CommonEntity 字段的 HQL 也认为 firstChildField 是 table 的一部分.

FirstChild 中删除该字段可以使 SecondChild 正常加载。

有没有一种方法可以确保在加载 Parent SuperClass CommonEntity 时它不使用 FirstChild 或 SecondChild 子类中的子字段?

编辑: 从数据库中获取实体:

String hql = "from org.example.CommonEntity + " where id = ?;
List<Object> objects = getHibernateTemplate().find(hql, new Object[] { id });

可能有帮助: 我的理解是 CommoonEntity 不是实体,因为它的 class 是 abstract (what is a db entity?)。不只有 CommonEntities,它们总是 ChildEntities。 Hibernate 不能简单地实例化那些。

所以 CommonEntity 应该用 @MappedSuperclass 注释(而不是 @Entity)。另见 Entity Enheritance

解决方案是在 Hibernate 中设置命名约定。它正在寻找使用下划线而不是大写字母的字段(即 first_field 而不是 firstField)。这未在数据库中表示,因此无法在子实体中找到字段。