Hibernate 5.2 从元模型中获取自然 id 属性

Hibernate 5.2 get natural id properties from metamodel

SessionFactory#getClassMetadata(java.lang.Class) was deprecated, I am not able to use ClassMetadata。我想访问以下方法:

根据文档,我应该用 EntityManagerFactory.getMetamodel() 替换 getClassMetada。但是,元模型不包含获取 natural-id 的方法。我正在为 natural-id 使用 xml 映射,我想获取 natural-id 的 属性 名称来创建动态查询。

<class name="User">
  <cache usage="read-write"/>
  <id name="id">
    <generator class="increment"/>
  </id>
  <natural-id>
    <property name="name"/>
    <property name="org"/>
  </natural-id>
  <property name="password"/>
</class>

嗯,知道 SessionFactory#getClassMetadata(java.lang.Class) 已被弃用,该选项正在使用 sessionFactory.getMetamodel()。检查休眠代码,这是我的解决方案:

MetamodelImplementor metamodel = (MetamodelImplementor) sessionFactory.getMetamodel();
ClassMetadata classMetadata = (ClassMetadata) metamodel.entityPersister(entityName);

首先,需要知道的重要部分是什么是 entityName。它可以是映射实体的名称或 Entity.class.getName()。知道了,要用 SessionFactory#getClassMetadata(java.lang.Class) 替换应该得到 class 的名称并将其作为字符串传递。

String entityName = EntityClass.class.getName();

其次,Hibernate 有一个 JPA 元模型的实现,名为 MetamodelImplementor。 此外,metamodel.entityPersister() return 是一个 EntityPersister 接口。 Hibernate 使用 AbstractEntityPersister 实现它。那是一个实现 Lockable 和 ClassMetadata 接口的抽象 class。

EntityPersister (interface) --> Lockable (interface) --> AbstractEntityPersister (abstract class)

ClassMetadata (interface) --> AbstractEntityPersister (abstract class)

因此,可以将 AbstractEntityPersister 转换为 ClassMetadata。这样 return 同一个对象。

这是SessionFactoryImpl中Hibernate的部分代码:

public ClassMetadata getClassMetadata(String entityName) throws HibernateException {
    return (ClassMetadata) getMetamodel().entityPersister( entityName );
}