如何读取hibernate生成的所有表名?

时间:2016-07-05 10:40:04

标签: java hibernate postgresql

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

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

    private String name;
    private int age;

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

结果我得到了:

CREATE TABLE ...

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

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

问题:如何从数据库中按插入顺序读取所有生成的表名?并使用他们生成的架构列名称?这有可能吗?

旁注:我只通过弹簧CrudRepository维护数据。

3 个答案:

答案 0 :(得分:2)

如果您拥有org.hibernate.cfg.Configuration,则可以访问PersistentClass es和Table es。

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);
    }

  }
}

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

 ApplicationContext appContext = ...;

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

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

您可以通过实施ApplicationContext获取任何其他spring bean中的ApplicationContextAware

答案 1 :(得分: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)));
        }
 }

答案 2 :(得分:0)

使用

mSession.getSessionFactory().getAllClassMetadata();

返回您可以使用的地图。