3.3.4 在运行时操作元数据

来源:互联网 发布:中国软件开发公司排名 编辑:程序博客网 时间:2024/06/04 19:25

有些时候,在运行时浏览、操作或者构建映射非常的有用。通过使用操作XML的API,如DOM、dom4j和JDOM能够直接在运行时操作XML文档。所以你可以在生成Configuration对象之前,在运行时创建或者操作XML文档。

然而,Hibernate提供了一个可配置的元数据模型。这个模型包含了所有在你XML文档中声明的信息。你可以通过编程的方式来操作这个模型,这对于那些需要对用户代码进行扩展的应用程序尤其有用。

举例来说,下面的代码为User类增加了一个新的属性motto:

//Get the esisting mapping for User from Configuration

PresistentClass User Mapping = cfg.getClassMapping(User.class);

//Define a new column for the USER table

Column column = new Column();

column.setType(Hibernate.STRING);

column.setName(“MOTTO”);

column.setNullable(false);

column.setUnique(true);

userMapping.getTable().addColumn(column);

//wrap the column in a Value

SimpleValue value=new SimpleValue();

value.setTable(userMapping.getTable());

value.addColumn(column);

value.setType(Hibernate.STRING);

 

//Define a new property of the User class

Property prop = new Property();

prop.setvalue(value);

prop.setName(“motto”);

userMapping.addProperty(prop);

//Build a new session factory, using the new mapping

SessionFactory sf=cfg.buildSessionFactory();

PersistentClass对象代表了元数据模型中一个持久化类;我们从Configuration取得它。Column,SimpleValue,Property都是Hibernate元数据模型的类,在net.sf.hibernate.mapping包中可以找到这些类。请记住在现存的持久化类中加入一个属性是很容易的,但是为还没有进行映射配置的类创建一个新的映射就有点复杂。

一旦SessionFactory被船舰之后,它的映射就不能再改变了。事实上,SessionFactory使用了一个内部不同的元数据模型而不是配置时的模型。你无法通过SessionFactory或者Session获得原始的Configuration。然而,应用程序可以通过getClassMetadata()或者getCollectionMetadata()方法来读取SessionFactory的元数据模型。举例如下:

Category categor=...;

ClassMetadata meta=sessionFactory.getClassMetadata(Category.class);

String[] metaPropertyNames = meta.getPropertyNames();

Object[] propertyValues = meta.getPropertyValues(category);

代码的快照取得了Category类的持久化属性,并且取得了某个特定对象的属性值。这能够帮助你书写一般性的代码。例如,你可以使用这个特性来为UI模块做标记或者改进日志输出。

现在让我们回到一个特殊的映射元素:标识符属性映射。我们将从对象标识开始讨论。