我使用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进行快速二级缓存查询?
答案 0 :(得分: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变体。
如果没有获取基类信息,则无法获取子类。因此,当您从缓存加载Sub-class时,也会检索关联的基类信息。因此,您可以让基类存储自然ID,或者只使用主键进行缓存。
您可以更新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
上的缓存注释来实现。
我从未尝试过,因此请在评论中确认解决方案。