Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate按自然id查询子类型实体_Java_Hibernate_Caching_Jpa_Natural Key - Fatal编程技术网

Java Hibernate按自然id查询子类型实体

Java Hibernate按自然id查询子类型实体,java,hibernate,caching,jpa,natural-key,Java,Hibernate,Caching,Jpa,Natural Key,我使用Hibernate并希望通过实体的自然标识符查询实体。然而,子类型上似乎不可能有自然ID。我有两个类A和B,其中B扩展了A: class A { long id; } class B extends A { String naturalId; } A在Hibernate中使用自己的标识符进行映射B被映射为连接的子类。但是,在Hibernate中不可能映射B的自然标识符,因为B的映射是一个子类映射 为什么子类B上不可能有一个自然标识符?请注意,我不希望Hibernate生成我的

我使用Hibernate并希望通过实体的自然标识符查询实体。然而,子类型上似乎不可能有自然ID。我有两个类A和B,其中B扩展了A:

class A {
  long id;
}

class B extends A {
  String naturalId;
}
A
在Hibernate中使用自己的标识符进行映射<代码>B被映射为连接的子类。但是,在Hibernate中不可能映射
B
的自然标识符,因为
B
的映射是一个子类映射

  • 为什么子类
    B
    上不可能有一个自然标识符?请注意,我不希望Hibernate生成我的数据库模式,我只希望有自然的ID来快速缓存命中

  • 是否有一种方法/最佳实践可以在子类型上使用自然ID进行快速二级缓存查询

    • 当自然ID在极少数情况下可能会更新(更改)并且缓存必须在集群JavaEE环境中维护时,这是否仍然可行
  • NaturalId只对基类有意义,因为没有基类信息就无法检索子类

    假设您可以使用自然id映射基类和子类:

    class A {
      long id;
      String baseId;
    }
    
    class B extends A {
      String naturalId;
    }
    
    A a = session.bySimpleNaturalId( A.class ).load( "abc" );
    
    如果我们检索的实体类型为B,则不清楚将使用哪种自然id变体

  • 如果不获取基类信息,则无法获取子类。因此,当您从缓存加载子类时,也会检索相关的基类信息。因此,您可以让基类存储自然id,或者简单地使用主键进行缓存

  • 您可以更新自然id,尽管a应该是不可变的。对于可变的自然ID,您需要使用属性

  • 根据:

    从Hibernate ORM 5.3开始,您现在可以覆盖基类@Cacheable 或子类级别的@Cache定义

    因此,您可能有机会在
    B
    上重置缓存注释

    我从未尝试过,因此请用评论确认解决方案。

    谢谢您的回答。然而,我不明白为什么Hibernate不知道使用哪个自然id,因为我们显式地给出了要查询的实体的类型。同样,定义一个与父类的自然id具有相同签名的自然id也很容易被禁止。从实现的角度来看,实现一些变通方法来覆盖子类中的基类自然id是可行的。您可以在Hibernate JIRA上针对这种情况提交Hibernate问题。