我有一个由多个子实体使用的公共实体:
@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;
}
}
CommonEntity
,FirstChild
和SecondChild
均为单独的表格,CommonEntity.id
加入FirstChild.id
或SecondChild.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 });
答案 0 :(得分:0)
可能是帮助:
我的理解是CommoonEntity
不是实体,因为它的类是abstract
(what is a db entity?)。没有CommonEntities,它们总是ChildEntities。 Hibernate可能根本就没有即时消息。
因此CommonEntity
应使用@MappedSuperclass
进行注释(而不是@Entity
)。另请参阅Entity Enheritance
答案 1 :(得分:0)
解决方案是在Hibernate中设置的命名约定。它正在寻找使用下划线而不是大写字母的字段(即first_field
而不是firstField
)。这没有在数据库中表示,因此无法在子实体中找到字段。