📄 mapping.html
字号:
</p></dd><dt><span class="term"><tt class="literal">assigned</tt></span></dt><dd><p> 让应用程序在<tt class="literal">save()</tt>之前为对象分配一个标示符。这是 <tt class="literal"><generator></tt>元素没有指定时的默认生成策略。 </p></dd><dt><span class="term"><tt class="literal">select</tt></span></dt><dd><p> 通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。 </p></dd><dt><span class="term"><tt class="literal">foreign</tt></span></dt><dd><p> 使用另外一个相关联的对象的标识符。通常和<tt class="literal"><one-to-one></tt>联合起来使用。 </p></dd></dl></div><p> </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>时无法使用<tt class="literal">hilo</tt>。 当Hibernate使用JTA获取应用服务器的数据源连接时,你必须正确地配置 <tt class="literal">hibernate.transaction.manager_lookup_class</tt>。 </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></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="person_id"> <generator class="sequence"> <param name="sequence">person_id_sequence</param> </generator></id></pre><pre class="programlisting"><id name="id" type="long" column="person_id" 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-assigned"></a>5.1.4.5. 程序分配的标识符(Assigned Identifiers)</h4></div></div><div></div></div><p> 如果你需要应用程序分配一个标示符(而非Hibernate来生成),你可以使用<tt class="literal">assigned</tt> 生成器。这种特殊的生成器会使用已经分配给对象的标识符属性的标识符值。 这个生成器使用一个自然键(natural key,有商业意义的列-译注)作为主键,而不是使用一个代理键( surrogate key,没有商业意义的列-译注)。这是没有指定<tt class="literal"><generator></tt>元素时的默认行为 </p><p> 当选择<tt class="literal">assigned</tt>生成器时,除非有一个version或timestamp属性,或者你定义了 <tt class="literal">Interceptor.isUnsaved()</tt>,否则需要让Hiberante使用 <tt class="literal">unsaved-value="undefined"</tt>,强制Hibernatet查询数据库来确定一个实例是瞬时的(transient) 还是脱管的(detached)。 </p></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="mapping-declaration-id-select"></a>5.1.4.6. 触发器实现的主键生成器(Primary keys assigned by triggers)</h4></div></div><div></div></div><p> 仅仅用于遗留的schema中 (Hibernate不能使用触发器生成DDL)。 </p><pre class="programlisting"><id name="id" type="long" column="person_id"> <generator class="select"> <param name="key">socialSecurityNumber</param> </generator></id></pre><p> 在上面的例子中,类定义了一个命名为<tt class="literal">socialSecurityNumber</tt>的唯一值属性, 它是一个自然键(natural key),命名为<tt class="literal">person_id</tt>的代理键(surrogate key) 的值由触发器生成。 </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</h3></div></div><div></div></div><pre class="programlisting"><composite-id name="propertyName" class="ClassName" mapped="true|false" access="field|property|ClassName" node="element-name|." > <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> &
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -