企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 5.1.5\. composite-id ``` <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> ``` 如果表使用联合主键,你可以映射类的多个属性为标识符属性。 `&lt;composite-id&gt;`元素接受`&lt;key-property&gt;` 属性映射和`&lt;key-many-to-one&gt;`属性映射作为子元素。 ``` <composite-id> <key-property name="medicareNumber"/> <key-property name="dependent"/> </composite-id> ``` 你的持久化类_必须_重载`equals()`和 `hashCode()`方法,来实现组合的标识符的相等判断。 实现`Serializable`接口也是必须的。 不幸的是,这种组合关键字的方法意味着一个持久化类是它自己的标识。除了对象自己之外, 没有什么方便的“把手”可用。你必须初始化持久化类的实例,填充它的标识符属性,再`load()` 组合关键字关联的持久状态。我们把这种方法称为_embedded(嵌入式)_的组合标识符,在重要的应用中不鼓励使用这种用法。 第二种方法我们称为_mapped(映射式)_组合标识符 (mapped composite identifier),`&lt;composite-id&gt;`元素中列出的标识属性不但在持久化类出现,还形成一个独立的标识符类。 ``` <composite-id class="MedicareId" mapped="true"> <key-property name="medicareNumber"/> <key-property name="dependent"/> </composite-id> ``` 在这个例子中,组合标识符类`MedicareId`和实体类都含有`medicareNumber`和`dependent`属性。标识符类必须重载`equals()`和`hashCode()`并且实现`Serializable`接口。这种方法的缺点是出现了明显的代码重复。 下面列出的属性是用来指定一个映射式组合标识符的: * `mapped` (可选, 默认为`false`): 指明使用一个映射式组合标识符,其包含的属性映射同时在实体类和组合标识符类中出现。 * `class` (可选,但对映射式组合标识符必须指定): 作为组合标识符类使用的类名. 在[第 8.4 节 “组件作为联合标识符(Components as composite identifiers)”](../Text/pr01_split_000.html "8.4\. 组件作为联合标识符(Components as composite identifiers)")一节中,我们会描述第三种方式,那就是把组合标识符实现为一个组件(component)类,这是更方便的方法。下面的属性仅对第三种方法有效: * `name` (可选,但对这种方法而言必须): 包含此组件标识符的组件类型的名字 (参阅第9章). * `access` (可选 - 默认为`property`): Hibernate应该使用的访问此属性值的策略 * `class` (可选 - 默认会用反射来自动判定属性类型 ): 用来作为组合标识符的组件类的类名(参阅下一节) 第三种方式,被称为_identifier component(标识符组件)_是我们对几乎所有应用都推荐使用的方式。