【问题标题】:Hibernate Single Table, query for all rowsHibernate Single Table,查询所有行
【发布时间】: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


【解决方案1】:

尝试直接在查询创建中对此值进行 SQL 查询过滤,而不是使用 @DiscriminatorColumn 和 @DiscriminatorValue 进行此操作。

 List<MyEntity> myList = this.sessionFactory.getCurrentSession().createQuery("from MyEntity where myobject_type != :pattern").setParameter("pattern", pattern).list();
return myList;

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多