我需要知道哪个物理列与持久性属性相关联。
e.g。
类LDocLine具有此属性
private Integer lineNumber;
在hibernate中映射,如下所示:
<property name="lineNumber" column="LINENUMBER" type="integer"/>
我需要的方法是:
getColumn(“LDocLine”,“lineNumber)=&gt;”LINENUMBER“
我认为它存在于内部,但不确定它是否在公共API中。
提前致谢
答案 0 :(得分:5)
您是否可以访问用于构建会话工厂的Configuration
对象?如果是这样,您可以使用以下内容:
Value v = configuration.getClassMapping(entityName).getProperty(propertyName).getValue();
for (Iterator it = v.getColumnIterator(); it.hasNext(); ) {
Column column = (Column) it.next();
column.getName(); // or .getQuotedName() or bunch of other useful stuff
}
Column文档。
如果您无权访问配置,则可以从SessionFactory
实例获取列数据,但是在这种情况下,您在技术上不再使用公共API,因为您必须将类转换为内部实现:
AbstractEntityPersister persister = (AbstractEntityPersister) sessionFactory.getClassMetadata(entityName);
String[] columnNames = persister.getPropertyColumnNames(propertyName);
在这两种情况下entityName
都是您实体的名称(除非明确覆盖,否则为其类名)
答案 1 :(得分:1)
正如您在回复中提到的,您无法访问“配置”对象。如果您有权访问hibernate“Session”对象,则以下代码可能对您有所帮助。
Collection clsMetaData = session.getSessionFactory()
.getAllClassMetadata().values();
for (Iterator i = clsMetaData.iterator(); i.hasNext();) {
ClassMetadata cmd = (ClassMetadata) i.next();
System.out.println("cmd" + cmd.getEntityName());
for (String s : cmd.getPropertyNames()) {
System.out.println("prop:" + s);
}
}
通过这种方式,您可以获得有关类元数据信息的详细信息。
答案 2 :(得分:0)
这是Hibernate通常不会使用的内容,因为您不需要引用列名来通过HQL或Criteria来检索对象。
为什么需要此功能?