📄 persistent-classes.html
字号:
column="ADDRESS" type="string"/> <many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/> <bag name="orders" inverse="true" lazy="false" cascade="all"> <key column="CUSTOMER_ID"/> <one-to-many class="Order"/> </bag> </class> </hibernate-mapping></pre><p> 注意,虽然是用目标类名来声明关联的,但是关联的目标类型除了是POJO之外,也可以 是一个动态的实体。 </p><p> 在使用<tt class="literal">dynamic-map</tt>为<tt class="literal">SessionFactory</tt> 设置了默认的实体模式之后,可以在运行期使用<tt class="literal">Map</tt>的 <tt class="literal">Map</tt>。 </p><pre class="programlisting">Session s = openSession();Transaction tx = s.beginTransaction();Session s = openSession();// Create a customerMap david = new HashMap();david.put("name", "David");// Create an organizationMap foobar = new HashMap();foobar.put("name", "Foobar Inc.");// Link bothdavid.put("organization", foobar);// Save boths.save("Customer", david);s.save("Organization", foobar);tx.commit();s.close();</pre><p> 动态映射的好处是,变化所需要的时间少了,因为原型不需要实现实体类。然而,你无法进行 编译期的类型检查,并可能由此会处理很多的运行期异常。幸亏有了Hibernate映射,它使得数 据库的schema能容易的规格化和合理化,并允许稍后在此之上添加合适的领域模型实现。 </p><p> 实体表示模式也能在每个<tt class="literal">Session</tt>的基础上设置: </p><pre class="programlisting">Session dynamicSession = pojoSession.getSession(EntityMode.MAP);// Create a customerMap david = new HashMap();david.put("name", "David");dynamicSession.save("Customer", david);...dynamicSession.flush();dynamicSession.close()...// Continue on pojoSession</pre><p> 请注意,用<tt class="literal">EntityMode</tt>调用<tt class="literal">getSession()</tt>是在 <tt class="literal">Session</tt>的API中,而不是<tt class="literal">SessionFactory</tt>。 这样,新的<tt class="literal">Session</tt>共享底层的JDBC连接,事务,和其他的上下文信 息。这意味着,你不需要在第二个<tt class="literal">Session</tt>中调用 <tt class="literal">flush()</tt>和<tt class="literal">close()</tt>,同样的,把事务和连接的处理 交给原来的工作单元。 </p><p> 关于XML表示能力的更多信息可以在<a href="xml.html" title="第 18 章 XML映射">第 18 章 <i>XML映射</i></a>中找到。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="persistent-classes-tuplizers"></a>4.5. 元组片断映射(Tuplizers)</h2></div></div><div></div></div><p> <tt class="literal">org.hibernate.tuple.Tuplizer</tt>,以及其子接口,负责根据给定的<tt class="literal">org.hibernate.EntityMode</tt>,来复现片断数据。如果给定的片断数据被认为其是一种数据结构,"tuplizer"就是一个知道如何创建这样的数据结构,以及如何给这个数据结构赋值的东西。比如说,对于POJO这种Entity Mode,对应的tuplizer知道通过其构造方法来创建一个POJO,再通过其属性访问器来访问POJO属性。有两大类高层Tuplizer,分别是<tt class="literal">org.hibernate.tuple.EntityTuplizer</tt> 和<tt class="literal">org.hibernate.tuple.ComponentTuplizer</tt>接口。<tt class="literal">EntityTuplizer</tt>负责管理上面提到的实体的契约,而<tt class="literal">ComponentTuplizer</tt>则是针对组件的。 </p><p> 用户也可以插入其自定义的tuplizer。或许您需要一种不同于dynamic-map entity-mode中使用的<tt class="literal">java.util.HashMap</tt>的<tt class="literal">java.util.Map</tt>实现;或许您需要与默认策略不同的代理生成策略(proxy generation strategy)。通过自定义tuplizer实现,这两个目标您都可以达到。Tuplizer定义被附加到它们期望管理的entity或者component映射中。回到我们的customer entity例子: </p><pre class="programlisting"><hibernate-mapping> <class entity-name="Customer"> <!-- Override the dynamic-map entity-mode tuplizer for the customer entity --> <tuplizer entity-mode="dynamic-map" class="CustomMapTuplizerImpl"/> <id name="id" type="long" column="ID"> <generator class="sequence"/> </id> <!-- other properties --> ... </class></hibernate-mapping>public class CustomMapTuplizerImpl extends org.hibernate.tuple.DynamicMapEntityTuplizer { // override the buildInstantiator() method to plug in our custom map... protected final Instantiator buildInstantiator( org.hibernate.mapping.PersistentClass mappingInfo) { return new CustomMapInstantiator( mappingInfo ); } private static final class CustomMapInstantiator extends org.hibernate.tuple.DynamicMapInstantitor { // override the generateMap() method to return our custom map... protected final Map generateMap() { return new CustomMap(); } }}</pre></div><p> TODO:property和proxy包里的用户扩展框架文档。 </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="session-configuration.html">上一页</a> </td><td width="20%" align="center"><a accesskey="u" href="index.html">上一级</a></td><td width="40%" align="right"> <a accesskey="n" href="mapping.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">第 3 章 配置 </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 第 5 章 对象/关系数据库映射基础(Basic O/R Mapping)</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -