2017-04-19 49 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); 
}