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;
}
}
CommonEntity
、FirstChild
和 SecondChild
都是独立的 table,CommonEntity.id
连接到 FirstChild.id
或 SecondChild.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
)。这未在数据库中表示,因此无法在子实体中找到字段。
我有多个子实体使用的公共实体:
@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
都是独立的 table,CommonEntity.id
连接到 FirstChild.id
或 SecondChild.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
)。这未在数据库中表示,因此无法在子实体中找到字段。