清单12:创建自定义字段
正如我们从实现中看到的一样,Hibernate在处理持久化对象的属性及其在数据库中的表示方面提供了更多的选择。下面分步讲解该方法的要素:
1)创建一个SimpleValue类对象,它指明了自定义字段的值如何被存储到字段和表所在的数据库中:
SimpleValue simpleValue = new SimpleValue(); simpleValue.addColumn(new Column("fld_" + name)); simpleValue.setTypeName(String.class.getName()); PersistentClass persistentClass = getPersistentClass(); simpleValue.setTable(persistentClass.getTable()); |
清单13:表创建新列
2)给持久化对象创建一个属性(property),并将动态组件添加进去,注意,这是我们为了这个目的已经计划好的:
Property property = new Property() property.setName(name) property.setValue(simpleValue) getCustomProperties().addProperty(property) |
清单14:创建对象属性
3)最后应该让应用修改xml文件,并更新Hibernate配置。这个可以由updateMapping()方法来完成;
阐明上面代码中另外两个get方法的用途还是很有必要的。第一个方法是getCustomProperties():
public Component getCustomProperties() { if (customProperties == null) { Property property = getPersistentClass().getProperty(CUSTOM_COMPONENT_NAME); customProperties = (Component) property.getValue(); } return customProperties; } |
清单15:获取组件CustomProperties
该方法找到并返回与业务实体映射中标签相对应的组件(Component)对象。
第二个方法是updateMapping():
private synchronized void updateMapping() { MappingManager.updateClassMapping(this); HibernateUtil.getInstance().reset(); // updateDBSchema(); } |
清单16:updateMapping()方法
该方法负责存储更新后的持久化类映射,并且更新Hibernate的配置状态,以进一步使改变生效。
顺便,我们回过头来看看Hibernate配置中的语句:
<property name="hibernate.hbm2ddl.auto">update</property> |
如果缺少该配置,我们就必须使用Hibernate工具类来执行数据库schema的更新。然而使用该设置让我们避免了那么做。
保存映射
运行时对映射的修改不会将自身保存到相应的xml映射文件中,为了使变化在应用下次的执行中活化,我们需要手动将变化保存到对应的映射文件中去。
我们使用MappingManager类来完成这件工作,该类的主要目的是将指定的业务实体的映射保存到其xml映射文件中去:
package com.enterra.customfieldsdemo; import com.enterra.customfieldsdemo.domain.CustomizableEntity; import org.hibernate.Session; import org.hibernate.mapping.Column; import org.hibernate.mapping.Property; import org.hibernate.type.Type; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.util.Iterator; public class MappingManager { public static void updateClassMapping(CustomizableEntityManager entityManager) { try { Session session = HibernateUtil.getInstance().getCurrentSession(); Class entityClass = entityManager.getEntityClass(); String file = entityClass.getResource(entityClass.getSimpleName() + ".hbm.xml").getPath(); Document document = XMLUtil.loadDocument(file); NodeList componentTags = document.getElementsByTagName("dynamic-component"); Node node = componentTags.item(0); XMLUtil.removeChildren(node); Iterator propertyIterator = entityManager.getCustomProperties().getPropertyIterator(); while (propertyIterator.hasNext()) { Property property = (Property) propertyIterator.next(); Element element = createPropertyElement(document, property); node.appendChild(element); } XMLUtil.saveDocument(document, file); } catch (Exception e) { e.printStackTrace(); } } private static Element createPropertyElement(Document document, Property property) { Element element = document.createElement("property"); Type type = property.getType(); element.setAttribute("name", property.getName()); element.setAttribute("column", ((Column) property.getColumnIterator().next()).getName()); element.setAttribute("type", type.getReturnedClass().getName()); element.setAttribute("not-null", String.valueOf(false)); return element; } } |
保留::
http://www.qqread.com/java/2008/01/d390951.html 
更多内容请看
Hibernate原理与配置、
Hibernate相关文章专题,或
进入讨论组讨论。
【深 度 阅 读】 相 关 文 章