📄 mapping.html
字号:
</p></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="mapping-declaration-id-hilo"></a>5.1.4.2. 高/低位算法(Hi/Lo Algorithm)</h4></div></div><div></div></div><p> <tt class="literal">hilo</tt> 和 <tt class="literal">seqhilo</tt>生成器给出了两种hi/lo算法的实现,这是一种很令人满意的标识符生成算法。第一种实现需要一个“特殊”的数据库表来保存下一个可用的“hi”值。第二种实现使用一个Oracle风格的序列(在被支持的情况下)。 </p><pre class="programlisting"><id name="id" type="long" column="cat_id"> <generator class="hilo"> <param name="table">hi_value</param> <param name="column">next_value</param> <param name="max_lo">100</param> </generator></id></pre><pre class="programlisting"><id name="id" type="long" column="cat_id"> <generator class="seqhilo"> <param name="sequence">hi_value</param> <param name="max_lo">100</param> </generator></id></pre><p> 很不幸,你在为Hibernate自行提供<tt class="literal">Connection</tt>,或者Hibernate使用JTA获取应用服务器的数据源连接的时候无法使用<tt class="literal">hilo</tt> 。Hibernate必须能够在一个新的事务中得到一个"hi"值。在EJB环境中实现hi/lo算法的标准方法是使用一个无状态的session bean。 </p></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="mapping-declaration-id-uuid"></a>5.1.4.3. UUID算法(UUID Algorithm )</h4></div></div><div></div></div><p> UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。在Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了。 </p><p> 不要试图在PostgreSQL中使用<tt class="literal">uuid.string</tt>。 </p></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="mapping-declaration-id-sequences"></a>5.1.4.4. 标识字段和序列(Identity columns and Sequences)</h4></div></div><div></div></div><p> 对于内部支持标识字段的数据库(DB2,MySQL,Sybase,MS SQL),你可以使用<tt class="literal">identity</tt>关键字生成。对于内部支持序列的数据库(DB2,Oracle, PostgreSQL, Interbase, McKoi,SAP DB),你可以使用<tt class="literal">sequence</tt>风格的关键字生成。这两种方式对于插入一个新的对象都需要两次SQL查询。 </p><pre class="programlisting"><id name="id" type="long" column="uid"> <generator class="sequence"> <param name="sequence">uid_sequence</param> </generator></id></pre><pre class="programlisting"><id name="id" type="long" column="uid" unsaved-value="0"> <generator class="identity"/></id></pre><p> 对于跨平台开发,<tt class="literal">native</tt>策略会从<tt class="literal">identity</tt>, <tt class="literal">sequence</tt> 和<tt class="literal">hilo</tt>中进行选择,取决于底层数据库的支持能力。 </p></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="mapping-declaration-id-assignedd"></a>5.1.4.5. 程序分配的标识符(Assigned Identifiers)</h4></div></div><div></div></div><p> 如果你需要应用程序分配一个标示符(而非Hibernate来生成它们),你可以使用<tt class="literal">assigned</tt>生成器。这种特殊的生成器会使用已经分配给对象的标识符属性的标识符值。用这种特性来分配商业行为的关键字要特别小心(基本上总是一种可怕的设计决定)。 </p><p> 因为其继承天性,使用这种生成器策略的实体不能通过Session的saveOrUpdate()方法保存。作为替代,你应该明确告知Hibernate是应该被save还是update,分别调用Session的<tt class="literal">save()</tt>或<tt class="literal">update()</tt>方法。 </p></div></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="mapping-declaration-compositeid"></a>5.1.5. composite-id 联合ID</h3></div></div><div></div></div><pre class="programlisting"><composite-id name="propertyName" class="ClassName" unsaved-value="any|none" access="field|property|ClassName"> <key-property name="propertyName" type="typename" column="column_name"/> <key-many-to-one name="propertyName class="ClassName" column="column_name"/> ......</composite-id></pre><p> 如果表使用联合主键,你可以把类的多个属性组合成为标识符属性。<tt class="literal"><composite-id></tt>元素接受<tt class="literal"><key-property></tt>属性映射和<tt class="literal"><key-many-to-one></tt>属性映射作为子元素。 </p><pre class="programlisting"><composite-id> <key-property name="medicareNumber"/> <key-property name="dependent"/></composite-id></pre><p> 你的持久化类<span class="emphasis"><em>必须</em></span>重载<tt class="literal">equals()</tt>和<tt class="literal">hashCode()</tt>方法,来实现组合的标识符判断等价.也必须实现<tt class="literal">Serializable</tt>接口。 </p><p> 不幸的是,这种组合关键字的方法意味着一个持久化类是它自己的标识。除了对象自己之外,没有什么方便的“把手”可用。你必须自己初始化持久化类的实例,在使用组合关键字<tt class="literal">load()</tt>持久化状态之前,必须填充他的联合属性。我们会在<a href="components.html#components-compositeid" title="7.4. 组件作为联合标识符(Components as composite identifiers)">第 7.4 节 “组件作为联合标识符(Components as composite identifiers)”</a>章中说明一种更加方便的方法,把联合标识实现为一个独立的类,下面描述的属性只对这种备用方法有效: </p><div class="itemizedlist"><ul type="disc" compact><li><p> <tt class="literal">name</tt> (可选):一个组件类型,持有联合标识(参见下一节)。 </p></li><li><p> <tt class="literal">class</tt> (可选 - 默认为通过反射(reflection)得到的属性类型) : 作为联合标识的组件类名(参见下一节)。 </p></li><li><p> <tt class="literal">unsaved-value</tt> (可选 - 默认为 <tt class="literal">none</tt>): 假如被设置为非none的值,就表示新创建,尚未被持久化的实例将持有的值。 </p></li></ul></div></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="mapping-declaration-discriminator"></a>5.1.6. 识别器(discriminator)</h3></div></div><div></div></div><p> 在"一棵对象继承树对应一个表"的策略中,<tt class="literal"><discriminator></tt>元素是必需的,它声明了表的识别器字段。识别器字段包含标志值,用于告知持久化层应该为某个特定的行创建哪一个子类的实例。只能使用如下受到限制的一些类型: <tt class="literal">string</tt>, <tt class="literal">character</tt>, <tt class="literal">integer</tt>, <tt class="literal">byte</tt>, <tt class="literal">short</tt>, <tt class="literal">boolean</tt>, <tt class="literal">yes_no</tt>, <tt class="literal">true_false</tt>. </p><div class="programlistingco"><pre class="programlisting"><discriminator column="discriminator_column" <span class="co">(1)</span> type="discriminator_type" <span class="co">(2)</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -