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

时间:2017-04-19 15:21:50

标签: java metadata hibernate-5.x metamodel naturalid

由于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>
  • 有没有办法使用这些方法来获取自然的id映射?
  • 是否有另一种获取ClassMetadata实例的方法?
  • 是否可以获取entityMetamodel的实例来替换ClassMetadata?

1 个答案:

答案 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 );
}