我正在使用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
维护数据。
答案 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)
方法 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();
返回您可以使用的地图。