【问题标题】:Hibernate 5.2 get natural id properties from metamodelHibernate 5.2 从元模型中获取自然 id 属性
【发布时间】:2017-04-19 15:21:49
【问题描述】:

由于SessionFactory#getClassMetadata(java.lang.Class) 已被弃用,我无法使用ClassMetadata。我想访问以下方法:

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

根据文档,我应该用 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>
  • 有没有办法使用这些方法来获取自然 id 映射?
  • 还有其他方法可以获取 ClassMetadata 实例吗?
  • 是否可以获取entityMetamodel 的实例来替换ClassMetadata?

【问题讨论】:

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


    【解决方案1】:

    好吧,知道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 有一个 JPA 元模型的实现,名为 MetamodelImplementor。 此外, metamodel.entityPersister() 返回一个 EntityPersister 接口。 Hibernate 使用 AbstractEntityPersister 实现它。这是一个实现 Lockable 和 ClassMetadata 接口的抽象类。

    EntityPersister (接口) --> Lockable (接口) --> AbstractEntityPersister(抽象类)

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

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

    这是SessionFactoryImpl中Hibernate的部分代码:

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

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 2014-12-10
      • 1970-01-01
      • 2013-06-06
      • 2011-06-07
      • 2019-03-01
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多