Hibernate 5.2 从元模型中获取自然 id 属性
Hibernate 5.2 get natural id properties from metamodel
自 SessionFactory#getClassMetadata(java.lang.Class)
was deprecated, I am not able to use 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?
嗯,知道 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)
替换应该得到 class 的名称并将其作为字符串传递。
String entityName = EntityClass.class.getName();
其次,Hibernate 有一个 JPA 元模型的实现,名为 MetamodelImplementor。
此外,metamodel.entityPersister() return 是一个 EntityPersister 接口。 Hibernate 使用 AbstractEntityPersister 实现它。那是一个实现 Lockable 和 ClassMetadata 接口的抽象 class。
EntityPersister (interface) --> Lockable (interface) -->
AbstractEntityPersister (abstract class)
ClassMetadata (interface) --> AbstractEntityPersister (abstract class)
因此,可以将 AbstractEntityPersister 转换为 ClassMetadata。这样 return 同一个对象。
这是SessionFactoryImpl
中Hibernate的部分代码:
public ClassMetadata getClassMetadata(String entityName) throws HibernateException {
return (ClassMetadata) getMetamodel().entityPersister( entityName );
}
自 SessionFactory#getClassMetadata(java.lang.Class)
was deprecated, I am not able to use 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?
嗯,知道 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)
替换应该得到 class 的名称并将其作为字符串传递。
String entityName = EntityClass.class.getName();
其次,Hibernate 有一个 JPA 元模型的实现,名为 MetamodelImplementor。 此外,metamodel.entityPersister() return 是一个 EntityPersister 接口。 Hibernate 使用 AbstractEntityPersister 实现它。那是一个实现 Lockable 和 ClassMetadata 接口的抽象 class。
EntityPersister (interface) --> Lockable (interface) --> AbstractEntityPersister (abstract class)
ClassMetadata (interface) --> AbstractEntityPersister (abstract class)
因此,可以将 AbstractEntityPersister 转换为 ClassMetadata。这样 return 同一个对象。
这是SessionFactoryImpl
中Hibernate的部分代码:
public ClassMetadata getClassMetadata(String entityName) throws HibernateException {
return (ClassMetadata) getMetamodel().entityPersister( entityName );
}