Java Hibernate按自然id查询子类型实体
我使用Hibernate并希望通过实体的自然标识符查询实体。然而,子类型上似乎不可能有自然ID。我有两个类A和B,其中B扩展了A: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生成我的
class A {
long id;
}
class B extends A {
String naturalId;
}
A
在Hibernate中使用自己的标识符进行映射<代码>B被映射为连接的子类。但是,在Hibernate中不可能映射B
的自然标识符,因为B
的映射是一个子类映射
- 为什么子类
上不可能有一个自然标识符?请注意,我不希望Hibernate生成我的数据库模式,我只希望有自然的ID来快速缓存命中B
- 是否有一种方法/最佳实践可以在子类型上使用自然ID进行快速二级缓存查询
- 当自然ID在极少数情况下可能会更新(更改)并且缓存必须在集群JavaEE环境中维护时,这是否仍然可行
class A {
long id;
String baseId;
}
class B extends A {
String naturalId;
}
A a = session.bySimpleNaturalId( A.class ).load( "abc" );
如果我们检索的实体类型为B,则不清楚将使用哪种自然id变体B
上重置缓存注释我从未尝试过,因此请用评论确认解决方案。谢谢您的回答。然而,我不明白为什么Hibernate不知道使用哪个自然id,因为我们显式地给出了要查询的实体的类型。同样,定义一个与父类的自然id具有相同签名的自然id也很容易被禁止。从实现的角度来看,实现一些变通方法来覆盖子类中的基类自然id是可行的。您可以在Hibernate JIRA上针对这种情况提交Hibernate问题。