📄 mapping.html
字号:
中创建它(例如:在遗留的schema中)。这样的话,你可以映射一个不可变的(immutable)并且是 只读的实体到一个给定的SQL子查询表达式: </p><pre class="programlisting"><class name="Summary"> <subselect> select item.name, max(bid.amount), count(*) from item join bid on bid.item_id = item.id group by item.name </subselect> <synchronize table="item"/> <synchronize table="bid"/> <id name="name"/> ...</class></pre><p> 定义这个实体用到的表为同步(synchronize),确保自动刷新(auto-flush)正确执行, 并且依赖原实体的查询不会返回过期数据。<tt class="literal"><subselect></tt>在属性元素 和一个嵌套映射元素中都可见。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="mapping-declaration-id"></a>5.1.4. id</h3></div></div><div></div></div><p> 被映射的类<span class="emphasis"><em>必须</em></span>定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性, 为每一个实例包含唯一的标识。<tt class="literal"><id></tt> 元素定义了该属性到数据库表主键字段的映射。 </p><div class="programlistingco"><pre class="programlisting"><id name="propertyName" <span class="co">(1)</span> type="typename" <span class="co">(2)</span> column="column_name" <span class="co">(3)</span> unsaved-value="null|any|none|undefined|id_value" <span class="co">(4)</span> access="field|property|ClassName" <span class="co">(5)</span> node="element-name|@attribute-name|element/@attribute|."> <generator class="generatorClass"/></id></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left">(1)</td><td valign="top" align="left"><p> <tt class="literal">name</tt> (可选): 标识属性的名字。 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</td><td valign="top" align="left"><p> <tt class="literal">type</tt> (可选): 标识Hibernate类型的名字。 </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</td><td valign="top" align="left"><p> <tt class="literal">column</tt> (可选 - 默认为属性名): 主键字段的名字。 </p></td></tr><tr><td width="5%" valign="top" align="left">(4)</td><td valign="top" align="left"><p> <tt class="literal">unsaved-value</tt> (可选 - 默认为一个切合实际(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。 这可以把这种实例和从以前的session中装载过(可能又做过修改--译者注) 但未再次持久化的实例区分开来。 </p></td></tr><tr><td width="5%" valign="top" align="left">(5)</td><td valign="top" align="left"><p> <tt class="literal">access</tt> (可选 - 默认为<tt class="literal">property</tt>): Hibernate用来访问属性值的策略。 </p></td></tr></table></div></div><p> 如果 <tt class="literal">name</tt>属性不存在,会认为这个类没有标识属性。 </p><p> <tt class="literal">unsaved-value</tt> 属性在Hibernate3中几乎不再需要。 </p><p> 还有一个另外的<tt class="literal"><composite-id></tt>定义可以访问旧式的多主键数据。 我们强烈不建议使用这种方式。 </p><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="mapping-declaration-id-generator"></a>5.1.4.1. Generator</h4></div></div><div></div></div><p> 可选的<tt class="literal"><generator></tt>子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, 用<tt class="literal"><param></tt>元素来传递。 </p><pre class="programlisting"><id name="id" type="long" column="cat_id"> <generator class="org.hibernate.id.TableHiLoGenerator"> <param name="table">uid_table</param> <param name="column">next_hi_value_column</param> </generator></id></pre><p> 所有的生成器都实现<tt class="literal">org.hibernate.id.IdentifierGenerator</tt>接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字: </p><div class="variablelist"><dl><dt><span class="term"><tt class="literal">increment</tt></span></dt><dd><p> 用于为<tt class="literal">long</tt>, <tt class="literal">short</tt>或者<tt class="literal">int</tt>类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 <span class="emphasis"><em>在集群下不要使用。</em></span> </p></dd><dt><span class="term"><tt class="literal">identity</tt></span></dt><dd><p> 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是<tt class="literal">long</tt>, <tt class="literal">short</tt> 或者<tt class="literal">int</tt>类型的。 </p></dd><dt><span class="term"><tt class="literal">sequence</tt></span></dt><dd><p> 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是<tt class="literal">long</tt>, <tt class="literal">short</tt>或者 <tt class="literal">int</tt>类型的。 </p></dd><dt><span class="term"><tt class="literal">hilo</tt></span></dt><dd><p><a name="mapping-declaration-id-hilodescription"></a> 使用一个高/低位算法高效的生成<tt class="literal">long</tt>, <tt class="literal">short</tt> 或者 <tt class="literal">int</tt>类型的标识符。给定一个表和字段(默认分别是 <tt class="literal">hibernate_unique_key</tt> 和<tt class="literal">next_hi</tt>)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。 </p></dd><dt><span class="term"><tt class="literal">seqhilo</tt></span></dt><dd><p> 使用一个高/低位算法来高效的生成<tt class="literal">long</tt>, <tt class="literal">short</tt> 或者 <tt class="literal">int</tt>类型的标识符,给定一个数据库序列(sequence)的名字。 </p></dd><dt><span class="term"><tt class="literal">uuid</tt></span></dt><dd><p> 用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。 </p></dd><dt><span class="term"><tt class="literal">guid</tt></span></dt><dd><p> 在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。 </p></dd><dt><span class="term"><tt class="literal">native</tt></span></dt><dd><p> 根据底层数据库的能力选择<tt class="literal">identity</tt>, <tt class="literal">sequence</tt> 或者<tt class="literal">hilo</tt>中的一个。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -