Hibernate通过natural-id查询子类型实体

时间:2015-03-11 11:18:13

标签: 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生成我的数据库架构,我只想拥有快速缓存命中的自然ID。

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

    • 在极少数情况下自然I​​D可能会更新(更改)并且必须在集群Java EE环境中维护缓存时,这仍然可行吗?

2 个答案:

答案 0 :(得分:1)

  1. NaturalId仅对基类有意义,因为如果没有基类信息,则无法检索子类。

    假设您可以使用natural-id映射基类和子类的映射:

    class A {
      long id;
      String baseId;
    }
    
    class B extends A {
      String naturalId;
    }
    
    A a = session.bySimpleNaturalId( A.class ).load( "abc" );
    

    如果我们检索的实体属于B类,则不清楚将使用哪种自然id变体。

  2. 如果没有获取基类信息,则无法获取子类。因此,当您从缓存加载Sub-class时,也会检索关联的基类信息。因此,您可以让基类存储自然ID,或者只使用主键进行缓存。

  3. 您可以更新natural-id,但business key应该是不可变的。对于 mutable natural-id,您需要使用mutable属性。

答案 1 :(得分:0)

根据13.3. Entity inheritance and second-level cache mapping

  

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

因此您可以通过重置B上的缓存注释来实现。
我从未尝试过,因此请在评论中确认解决方案。