gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:48:57 25 4
gpt4 key购买 nike

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

  • org.hibernate.metadata.ClassMetadata#g​​etNaturalIdentifierProperties
  • org.hibernate.metadata.ClassMetadata#hasNaturalIdentifier

根据文档,我应该将 getClassMetada 替换为 EntityManagerFactory.getMetamodel()。但是,元模型不包含获取 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 的实例?替换类元数据?

最佳答案

嗯,知道 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 接口(interface)。 Hibernate 使用 AbstractEntityPersister 实现它。这是一个实现 Lockable 和 ClassMetadata 接口(interface)的抽象类。

EntityPersister (interface) --> Lockable (interface) --> AbstractEntityPersister (abstract class)

ClassMetadata (interface) --> AbstractEntityPersister (abstract class)

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

这是SessionFactoryImpl中Hibernate的部分代码:

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

关于java - Hibernate 5.2 从元模型中获取自然 id 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43499887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com