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

时间:2016-01-14 14:40:46

标签: java hibernate hql

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

@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均为单独的表格,CommonEntity.id加入FirstChild.idSecondChild.id

尝试从数据库加载FirstChild时,选择CommonEntity字段的HQL认为firstChildField是该表的一部分,尽管它是FirstChild的一部分} table。

尝试从数据库加载SecondChild时,选择CommonEntity字段的HQL也认为firstChildField是该表的一部分。

FirstChild删除字段可以正常加载SecondChild

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

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

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

2 个答案:

答案 0 :(得分:0)

可能是帮助: 我的理解是CommoonEntity不是实体,因为它的类是abstractwhat is a db entity?)。没有CommonEntities,它们总是ChildEntities。 Hibernate可能根本就没有即时消息。

因此CommonEntity应使用@MappedSuperclass进行注释(而不是@Entity)。另请参阅Entity Enheritance

答案 1 :(得分:0)

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