2017-04-19 78 views
0

由于SessionFactory#getClassMetadata(java.lang.Class)已被弃用,因此我无法使用ClassMetadata。我想访问以下方法:Hibernate 5.2从元模型中获取自然ID属性

  • org.hibernate.metadata.ClassMetadata#getNaturalIdentifierProperties
  • org.hibernate.metadata.ClassMetadata#hasNaturalIdentifier

根据该文件,我应该EntityManagerFactory.getMetamodel取代getClassMetada()。但是,元模型不包含获取自然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> 
  • 有没有使用这些方法来获取自然ID映射的方法吗?
  • 是否有另一种获得ClassMetadata实例的方法?
  • 是否有可能获得entityMetamodel的实例来替换ClassMetadata?

回答

0

那么,知道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)应获得该类的名称并将其作为字符串传递。

String entityName = EntityClass.class.getName(); 

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

EntityPersister(接口) - >可锁定(接口) - > AbstractEntityPersister(抽象类)

ClassMetadata(接口) - >AbstractEntityPersister(抽象类)

因此,可以将AbstractEntityPersister转换为ClassMetadata。并以这种方式返回相同的对象。

这是一个SessionFactoryImpl的休眠的代码部分:

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