【问题标题】:How to read all table names generated by hibernate?如何读取hibernate生成的所有表名?
【发布时间】:2021-04-18 21:58:13
【问题描述】:

我正在使用hibernate 生成postgresql 表架构:

@Entity
public class MyEntity {
    @Id
    private long id;

    private String name;
    private int age;

    @Column(name = "testdate")
    private Date thedate;
}

结果我得到:

CREATE TABLE ...

无论@Entity中的字段顺序如何,表格字段都是按字母顺序创建的。

当我稍后添加其他字段时,它们通常只是作为额外的列附加到数据库中,而不是按字母顺序插入。

问题:如何从数据库中按插入顺序读取所有生成的表名?以及他们生成的模式列名?这可能吗?

旁注:我仅通过 springs CrudRepository 维护数据。

【问题讨论】:

标签: java hibernate postgresql


【解决方案1】:

如果您有org.hibernate.cfg.Configuration,则可以访问PersistentClasses 和Tablees。

public void printTables(Configuration configuration) throws MappingException {  
  Iterator classMappingIterator =   configuration.getClassMappings();

  while(classMappingIterator.hasNext()) {
    PersistentClass persistentClass = (PersistentClass)classMappingIterator.next();

    Table table = persistentClass.getTable();
    String tableName = table.getName();

    Iterator columnIterator = table.getColumnIterator();

    while(columnIterator.hasNext()){
        Column column = (Column) columnIterator.next();
        String columnName = column.getName();

        System.out.println(tableName + "." + columnName);
    }

  }
}

在春季,您可以通过LocalSessionFactoryBean 获得Configuration。

 ApplicationContext appContext = ...;

 LocalSessionFactoryBean lsfb = (LocalSessionFactoryBean) appContext.getBean("&sessionFactory");

您必须使用& 前缀来获取工厂bean。否则你会得到工厂创建的bean。

您可以通过实现ApplicationContextAware 在任何其他spring bean 中获取ApplicationContext。

【讨论】:

    【解决方案2】:

    截至 Hibernate - 5.4.30.Final - 2021 年 3 月 19 日发布

    方法getAllClassMetadata() 从几年前就不再支持
    下面的代码有效且不推荐使用:

    MetamodelImplementor metaModelImpl = (MetamodelImplementor)session.getMetamodel();
    Map<String, EntityPersister> entityPersisters = metaModelImpl.entityPersisters();
    Collection<EntityPersister> val = entityPersisters.values();               
    
    for (EntityPersister ep : val) {
            AbstractEntityPersister aep = (AbstractEntityPersister)ep;
    
            System.out.println(aep.getTableName());
            System.out.println(Arrays.toString(aep.getIdentifierColumnNames()));
            for (String propName : aep.getPropertyNames()) {
                   System.out.println(propName);
                   System.out.println(Arrays.toString(aep.getPropertyColumnNames(propName)));
            }
     }
    

    【讨论】:

      【解决方案3】:

      使用

      mSession.getSessionFactory().getAllClassMetadata();
      

      返回您可以使用的地图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-13
        • 2016-08-14
        • 1970-01-01
        • 2019-08-22
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多