【发布时间】:2015-10-15 13:45:11
【问题描述】:
所以,我已经习惯使用带注释的 Hibernate 4 有一段时间了。传统上,我每张桌子做 1 个具体的课程,做完再做,这一直对我有用。
现在,我仍在使用 Hibernate 4.3.11,并且是第一次使用 Single Table Hierarchy。我有一个主/根类如下:
@Entity
@Table(name = "mytable")
@SuppressWarnings("serial")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "myobject_type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "ABC")
public class MyEntity extends BaseEntity
所以,我想知道这个类是否应该是抽象类???似乎不需要。
子类定义如下:
@Entity
@DiscriminatorValue(value = "XYZ")
public class XyzEntity extends MyEntity
我为 MyEntity 创建了一个 DAO,这些方法 create/update/findById 的单元测试似乎都可以工作......但“getAllList”似乎没有。
@Override
public List<MyEntity> getAllList()
{
List<MyEntity> myList = this.sessionFactory.getCurrentSession().createQuery("from MyEntity").list();
return myList;
}
当我对该方法进行单元测试时,我收到一条错误消息。
org.hibernate.WrongClassException: Object [id=708] was not of the specified subclass [com.myapp.server.model.common.MyEntity] : Discriminator: XYZ
我应该说我在数据库中有 4 条记录。 2 条记录在“myobject_type”字段中的值为“XYZ”,另一条记录的值为“ABC”
所以,我想知道我是否应该在我的根类中使用 DiscriminatorValue ???我使该字段“myobject_type”不为空,因此,如果创建了 XyzEntity,我将确保每条记录都有一个用于 MyEntity 记录的鉴别器值“ABC”,以及一个“XYZ”值。同样,新的 MnoEntity 在该字段中可能具有“MNO”值。
只是好奇,在整个层次结构中,如果我有两个 MyEntity 的子类,我可以在这两个子实体中拥有相同的字段吗?或者,我想我可以将在多个地方使用的字段移至根实体。
再次,这是我第一次在 Hibernate 中使用单表层次结构,我只需要解决这个错误消息。非常感激任何的帮助!!!谢谢!
汤姆
【问题讨论】:
-
是的。我对这个问题进行了广泛的搜索,并查看了几十页关于单表层次结构的正确示例。一些例子表明基类/实体不必是抽象的,我当然可以使类抽象,问题就消失了。但是如果我正在开发的应用程序确实需要这个根类,我只想知道我是否可以解决这个问题?
-
在我发布的问题中,用户使用 insertable=false、updateable=false 创建了另一个抽象类,因此您仍然可以使用您的根类
标签: java spring hibernate postgresql-9.3