当前位置: 首页 > 知识库问答 >
问题:

Hibernate忽略鉴别器列-始终使用“dtype”

段干祺
2023-03-14

我的SINGLE_TAB继承Hibernate配置中出现了一个奇怪的情况,@DiscriminatorColumn似乎被忽略了,而查询总是默认返回到'dtype'列。这就像我在完全没有包含注释(默认列名为'dType')时看到的行为一样。

基本实体:

@Entity
@Table(name = "post")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(columnDefinition = "post_type", discriminatorType = DiscriminatorType.STRING)
public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "title")
    private String title;

    @Column(name = "body")
    private String body;

    @NotNull
    @Column(name = "post_type", insertable = false, updatable = false)
    private String postType;

    // other simple columns



    // ommit getters/setters + hashcode etc
}

子类实体:

@Entity
@DiscriminatorValue(value = "EVENT")
public class Event extends Post {

    // ommitted basic methods, no extra config

}

我还需要访问每个对象中的鉴别器值本身(postType字段)。我仍然有相同的行为,即使我移除它,所以它似乎不是原因。

当我试图通过JPA存储库对子类执行查询时:

public interface EventRepository extends JpaRepository<Event, Integer> {
    List<Event> findAll();
}

Hibernate生成查询:

select post0_.id as id2_4_, post0_.bodyl as body_bod3_4_, post0_.title as title12_4_ 
from post post0_ 
where post0_.dtype='EVENT'

这当然会生成一个错误,因为“dtype”在表中不存在。

共有1个答案

应煌
2023-03-14

我认为您有这个问题是因为您指定了@discriminatorcolumnanotation的错误参数,您应该使用name而不是columndefinition

 类似资料:
  • 我们有一个遗留表,我们不希望通过添加鉴别器列来改变它。有没有可能有不带鉴别器列的tablePerHierarchy。 下面是我的父级和子级代码 @Table(名称=“Shape1”)@Inheritation(策略=InheritanceType.Single_Table)@DiscriminatorColumn(名称=“Discriminator”,discriminatorType=discr

  • 我们有一个遗留表,我们不想在其中添加鉴别器列。没有鉴别器列,是否有可能有每个层次结构的表? 我的父类代码: 我的孩子班: 你可以在我上面的例子中看到,我必须使用鉴别器。

  • 问题内容: 假设以下模型: 以及以下DQL查询: 生成的SQL将是: 现在要问的问题:如何从该查询中删除该子句。在更复杂的查询中,该子句的这一部分使得无法使用某些已定义的索引。这可以通过添加索引来解决,但这会使我的索引变大,我觉得这是没有必要的。 该是在继承树的根。因此,我们对表中的所有记录都感兴趣。省略零件就可以做到这一点。 所以问题是:在没有必要的情况下,我该如何使Doctrine删除此部分。

  • 我有一个具体的JPA实体超类,它使用鉴别器列与映射,还有两个子类实体,它们用其他属性扩展了这个超类。 在某些情况下,我希望指定额外的鉴别器值,而不必为每个类型显式定义子类(也就是说,并不是每个“baseEntity”都指定支持子类/单独表的额外属性)。这种策略在数据库设计和Java类层次结构中都很有效,但是,Hibernate JPA不允许这样做,并抛出,因为没有映射到鉴别器的子类: 在本例中,我

  • 问题内容: 这是我的实体: 这是我获得人员名单的方式: 如果我正确理解提取图,则它必须仅加载我指定的那些字段。但是,字段“ birthDate”也已加载。此外,我看到在hibernateSQL查询中选择了4列。 如何解决?我使用hibernate 5.1.0作为JPA提供程序。 问题答案: 实体图旨在控制延迟或渴望加载哪些关系(例如,一对一,一对多等)。它们可能不适用于加载各个列(取决于提供程序)

  • 我已经在web上阅读了几篇关于多租户(针对SaaS应用程序中的不同客户端)的文章(即这个和那个)。一旦您决定采用基于鉴别器的方法,hibernate文档声明,版本4不支持这种方法,但将在版本5中提供。 尽管如此,您可能会找到几篇关于为此目的使用hibernate过滤器的文章(即这篇和那篇)。 我想知道,如果基于过滤器的解决方案可以的话,为什么在版本5中会有一些特殊的实现呢。因此:基于过滤器的解决方