2

我有两个表 A -> B 具有多对一映射/关联。

表 B 的主键是表 A 中的外键。

问题是两个表中的列名不同。假设 B 具有主键列“typeNumId”,它是表 A 中的外键作为“类型”。如何在此列上加入两个表?我如何指定映射以指示表必须加入本质上相同的“typeNumId”和“type”。

特别是这可以通过休眠配置(hbm 文件)吗?

就像是

<many-to-one name="Type" class="com.domain.ProcedureType" update="false" insert="false" fetch="join" lazy="false">
    <column name="? <this is in questions? >" not-null="true" />
</many-to-one>
4

3 回答 3

3

ON 子句:

select * from A join B on A.type = B.typeNumId
于 2010-09-03T13:37:29.877 回答
1

column您使用元素的属性many-to-one或等效的嵌套元素声明外键的名称column。从文档中:

5.1.12。多对一

使用多对一元素声明与另一个持久类的普通关联。关系模型是多对一的关联;一个表中的外键正在引用目标表的主键列。

<many-to-one
        name="propertyName"                                          (1)
        column="column_name"                                         (2)
        class="ClassName"                                            (3)
        cascade="cascade_style"                                      (4)
        fetch="join|select"                                          (5)
        update="true|false"                                          (6)
        insert="true|false"                                          (6)
        property-ref="propertyNameFromAssociatedClass"               (7)
        access="field|property|ClassName"                            (8)
        unique="true|false"                                          (9)
        not-null="true|false"                                        (10)
        optimistic-lock="true|false"                                 (11)
        lazy="proxy|no-proxy|false"                                  (12)
        not-found="ignore|exception"                                 (13)
        entity-name="EntityName"                                     (14)
        formula="arbitrary SQL expression"                           (15)
        node="element-name|@attribute-name|element/@attribute|."
        embed-xml="true|false"
        index="index_name"
        unique_key="unique_key_id"
        foreign-key="foreign_key_name"
/>
  1. 名称:属性的名称。
  2. column(可选):外键列的名称。这也可以由嵌套元素指定。
  3. 类(可选 - 默认为反射确定的属性类型):关联类的名称。
  4. cascade(可选):指定哪些操作应该从父对象级联到关联对象。
  5. fetch(可选 - 默认为 select):在外连接获取或顺序选择获取之间进行选择。
  6. update, insert(可选 - 默认为 true):指定映射列应包含在 SQL UPDATE 和/或 INSERT 语句中。将两者都设置为 false 允许纯“派生”关联,其值从映射到相同列的另一个属性初始化,或者由触发器或其他应用程序初始化。
  7. property-ref (可选):与此外键连接的关联类的属性名称。如果未指定,则使用关联类的主键。
  8. 访问(可选 - 默认为属性):Hibernate 用于访问属性值的策略。
  9. unique(可选):启用 DDL 为外键列生成唯一约束。通过允许它成为 property-ref 的目标,您可以使关联多重性一对一。
  10. not-null(可选):启用 DDL 为外键列生成可空性约束。
  11. 乐观锁(可选 - 默认为 true):指定对此属性的更新是否需要获取乐观锁。换句话说,它确定当这个属性变脏时是否应该发生版本增量。
  12. 懒惰(可选 - 默认为代理):默认情况下,单点关联是代理的。lazy="no-proxy" 指定第一次访问实例变量时应该延迟获取属性。这需要构建时字节码检测。lazy="false" 指定总是急切地获取关联。
  13. 未找到(可选 - 默认为异常):指定如何处理引用缺失行的外键。ignore 会将缺失的行视为空关联。
  14. entity-name(可选):关联类的实体名称。
  15. 公式(可选):定义计算外键值的 SQL 表达式。

所以这样的事情应该这样做:

<many-to-one name="Type" class="com.domain.ProcedureType" update="false" insert="false" fetch="join" lazy="false">
    <column name="type" not-null="true" />
</many-to-one>

参考

于 2010-09-03T17:06:41.717 回答
0

像这样的东西?

LEFT JOIN B on A.field1 = B.field2

根据您的喜好选择 JOIN 类型

于 2010-09-03T13:36:53.077 回答