由于SessionFactory#getClassMetadata(java.lang.Class)
已被弃用,我无法使用ClassMetadata。我想访问以下方法:
org.hibernate.metadata.ClassMetadata#getNaturalIdentifierProperties
org.hibernate.metadata.ClassMetadata#hasNaturalIdentifier
根据文档,我应该用EntityManagerFactory.getMetamodel()替换getClassMetada。但是,元模型不包含获取natural-id的方法。我正在使用自然id的xml映射,我想获得自然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>
entityMetamodel
的实例来替换ClassMetadata?答案 0 :(得分:2)
嗯,知道SessionFactory#getClassMetadata(java.lang.Class)
已被弃用,该选项正在使用sessionFactory.getMetamodel()
。检查hibernate代码,这是我的解决方案:
MetamodelImplementor metamodel = (MetamodelImplementor) sessionFactory.getMetamodel();
ClassMetadata classMetadata = (ClassMetadata) metamodel.entityPersister(entityName);
首先,要知道的一个重要部分是entityName。它可以是映射实体的名称或Entity.class.getName()。知道要替换SessionFactory#getClassMetadata(java.lang.Class)
,应该获取类的名称并将其作为字符串传递。
String entityName = EntityClass.class.getName();
其次,Hibernate有一个JPA元模型的实现,名为MetamodelImplementor。 此外,metamodel.entityPersister()返回EntityPersister接口。 Hibernate使用AbstractEntityPersister实现它。这是一个实现Lockable和ClassMetadata接口的抽象类。
EntityPersister(界面) - &gt;可锁定(界面) - &gt; AbstractEntityPersister (抽象类)
ClassMetadata(interface) - &gt; AbstractEntityPersister (抽象类)
因此,可以将AbstractEntityPersister转换为ClassMetadata。并以这种方式返回相同的对象。
这是SessionFactoryImpl
中的Hibernate代码的一部分:
public ClassMetadata getClassMetadata(String entityName) throws HibernateException {
return (ClassMetadata) getMetamodel().entityPersister( entityName );
}