Java 如何从Hibernate元数据源中发现完全限定的表列

Java 如何从Hibernate元数据源中发现完全限定的表列,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个实体,我有一个类引用: @Entity class MyEntity { @Id int id; @Column String col1; @Column(name = "abc") String col2; } 我目前正在使用Hibernate将实体导出到内存中的数据库中,如下所示: MetadataSources metadata = new MetadataSources(...); metadata.addAnnotatedClass(MyEntity.

我有一个实体,我有一个
引用:

@Entity
class MyEntity {
    @Id int id;
    @Column String col1;
    @Column(name = "abc") String col2;
}
我目前正在使用Hibernate将实体导出到内存中的数据库中,如下所示:

MetadataSources metadata = new MetadataSources(...);
metadata.addAnnotatedClass(MyEntity.class);
SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.DATABASE), metadata.buildMetadata());


有没有可靠的方法可以通过Hibernate API从
MyEntity.col2
(带注释的Java字段引用)映射到数据库中的完全限定列名(反之亦然)?我希望避免在没有明确限定的情况下重新实现Java标识符(包括getter和setter)如何映射到SQL标识符的所有微妙细节。

我们感兴趣的是
org.hibernate.boot.Metadata
,因为它包含
PersistentClass
实体绑定

首先,您需要创建一个
集成器
,它将允许您访问
元数据

public class MetadataExtractorIntegrator 
    implements org.hibernate.integrator.spi.Integrator {
 
    public static final MetadataExtractorIntegrator INSTANCE = 
        new MetadataExtractorIntegrator();
 
    private Database database;
 
    private Metadata metadata;
 
    public Database getDatabase() {
        return database;
    }
 
    public Metadata getMetadata() {
        return metadata;
    }
 
    @Override
    public void integrate(
            Metadata metadata,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
 
        this.database = metadata.getDatabase();
        this.metadata = metadata;
 
    }
 
    @Override
    public void disintegrate(
        SessionFactoryImplementor sessionFactory,
        SessionFactoryServiceRegistry serviceRegistry) {
 
    }
}
如果您使用JPA,您可以按如下方式注册:

Map<String, Object> configuration = new HashMap<>();
 
Integrator integrator = integrator();
if (integrator != null) {
    configuration.put("hibernate.integrator_provider", 
        (IntegratorProvider) () -> Collections.singletonList(
            MetadataExtractorIntegrator.INSTANCE
        )
    );
}
 
EntityManagerFactory entityManagerFactory = new EntityManagerFactoryBuilderImpl(
    new PersistenceUnitInfoDescriptor(persistenceUnitInfo), 
    configuration
)
.build();
针对以下实体:

我们得到以下输出:

Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$Tag is mapped to table: tag
Property: name is mapped on table column: name of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$PostComment is mapped to table: post_comment
Property: post is mapped on table column: post_id of type: bigint
Property: review is mapped on table column: review of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$Post is mapped to table: post
Property: title is mapped on table column: title of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$PostDetails is mapped to table: post_details
Property: createdBy is mapped on table column: created_by of type: varchar(255)
Property: createdOn is mapped on table column: created_on of type: datetime(6)
Property: version is mapped on table column: version of type: integer
很酷,对吧


您也可以查看此示例。

嘿,这说明在Hibernate 5.4和postgresql中无法正常工作。除非在属性中设置了
hibernate.hbm2ddl.auto=create
,否则类型将返回为null。我们希望使用
验证
,但是使用它我们无法访问属性类型。您知道这是否是预期行为,以及是否存在解决方法吗?
hbm2ddl
设置不应影响
元数据
绑定。听起来像个虫子。如果是这样,您需要复制它并打开Hibernate Jira问题。
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$Tag is mapped to table: tag
Property: name is mapped on table column: name of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$PostComment is mapped to table: post_comment
Property: post is mapped on table column: post_id of type: bigint
Property: review is mapped on table column: review of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$Post is mapped to table: post
Property: title is mapped on table column: title of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$PostDetails is mapped to table: post_details
Property: createdBy is mapped on table column: created_by of type: varchar(255)
Property: createdOn is mapped on table column: created_on of type: datetime(6)
Property: version is mapped on table column: version of type: integer