4.5. 元组片断映射(Tuplizers)

org.hibernate.tuple.Tuplizer,以及其子接口,负责根据给定的org.hibernate.EntityMode,来复现片断数据。如果给定的片断数据被认为其是一种数据结构,"tuplizer"就是一个知道如何创建这样的数据结构,以及如何给这个数据结构赋值的东西。比如说,对于POJO这种Entity Mode,对应的tuplizer知道通过其构造方法来创建一个POJO,再通过其属性访问器来访问POJO属性。有两大类高层Tuplizer,分别是org.hibernate.tuple.entity.EntityTuplizerorg.hibernate.tuple.entity.ComponentTuplizer接口。EntityTuplizer负责管理上面提到的实体的契约,而ComponentTuplizer则是针对组件的。

用户也可以插入其自定义的tuplizer。或许您需要一种不同于dynamic-map entity-mode中使用的java.util.HashMapjava.util.Map实现;或许您需要与默认策略不同的代理生成策略(proxy generation strategy)。通过自定义tuplizer实现,这两个目标您都可以达到。Tuplizer定义被附加到它们期望管理的entity或者component映射中。回到我们的customer entity例子:

  1. <hibernate-mapping>
  2. <class entity-name="Customer">
  3. <!--
  4. Override the dynamic-map entity-mode
  5. tuplizer for the customer entity
  6. -->
  7. <tuplizer entity-mode="dynamic-map"
  8. class="CustomMapTuplizerImpl"/>
  9. <id name="id" type="long" column="ID">
  10. <generator class="sequence"/>
  11. </id>
  12. <!-- other properties -->
  13. ...
  14. </class>
  15. </hibernate-mapping>
  16. public class CustomMapTuplizerImpl
  17. extends org.hibernate.tuple.entity.DynamicMapEntityTuplizer {
  18. // override the buildInstantiator() method to plug in our custom map...
  19. protected final Instantiator buildInstantiator(
  20. org.hibernate.mapping.PersistentClass mappingInfo) {
  21. return new CustomMapInstantiator( mappingInfo );
  22. }
  23. private static final class CustomMapInstantiator
  24. extends org.hibernate.tuple.DynamicMapInstantitor {
  25. // override the generateMap() method to return our custom map...
  26. protected final Map generateMap() {
  27. return new CustomMap();
  28. }
  29. }
  30. }