【问题标题】:Hibernate join mapping for many-to-one with multiple columns多列多对一的休眠连接映射
【发布时间】:2012-02-02 22:20:00
【问题描述】:

我正在尝试使用 Hibernate 将表作为一组 DTO 映射到另一个 DTO。我遇到了麻烦,因为我需要使用两列进行映射。请有人告诉我在休眠映射文件中写什么来进行映射,因为无论我在映射的“加入”部分中放了什么,它都不会被接受为有效格式。

我正在尝试使用休眠映射的 DTO:

公共类 CoverageDTO 扩展 BaseDTO {

private SupplierDTO supplierDTO;
private MarketDTO marketDTO;
private Float   price;
private String  currency;

private Set<SpecialRuleDTO> specialRules = new HashSet<SpecialRuleDTO>(0);

}

底层 SQL 表是:

供应商表,列出了我们有哪些供应商 - 主键是 SUPPLIER_ID,其他细节无关。

市场表,列出了供应商可能能够提供其产品的不同市场 - 主键是 MARKET_ID,其他细节无关紧要。

覆盖表 - 列出供应商可以到达的市场,以及该供应商在该市场的价格/货币是多少

CREATE TABLE  coverage (
  COVERAGE_ID int(10) unsigned NOT NULL auto_increment,
  SUPPLIER_ID int(10) unsigned NOT NULL,
  MARKET_ID int(10) unsigned NOT NULL,
  PRICE float default NULL,
  CURRENCY varchar(5) default NULL,
  PRIMARY KEY  USING BTREE (COVERAGE_ID)
) DEFAULT;

supplier_special_rules 表 - 列出可应用于供应商的特殊规则。

CREATE TABLE  supplier_special_rules (
  SUPPLIER_SPECIAL_RULE_ID bigint(20) unsigned NOT NULL auto_increment,
  SUPPLIER_ID bigint(20) unsigned NOT NULL,
  NAME varchar(128) NOT NULL,
  TYPE varchar(128) NOT NULL,
  VALUE float NOT NULL,
  PRIMARY KEY  (SUPPLIER_SPECIAL_RULE_ID)
) DEFAULT;

supplier_coverage_special_rules - 列出应该对供应商和市场应用哪些特殊规则。

CREATE TABLE  supplier_coverage_special_rules (
  SUPPLIER_COVERAGE_SPECIAL_RULE_ID bigint(20) unsigned NOT NULL auto_increment,
  MARKET_ID bigint(20) unsigned NOT NULL,
  SUPPLIER_SPECIAL_RULE_ID bigint(20) unsigned NOT NULL,
  PRIMARY KEY  (SUPPLIER_COVERAGE_SPECIAL_RULE_ID)
) DEFAULT;

因此,在 SQL 级别考虑,我需要使用供应商覆盖特殊规则表中的信息(即通过匹配 MARKET_ID 和 SUPPLIER_ID 列)将供应商特殊规则映射到覆盖率表中。我虽然下面的映射会做到这一点,但它似乎不是一个有效的映射语法。

<hibernate-mapping package="net.dtopath">
    <class name="CoverageDTO" table="coverage">
        <id column="COVERAGE_ID" name="ID">
            <generator class="native"/>
        </id>

        <many-to-one class="net.dtopath.SupplierDTO" column="SUPPLIER_ID" name="supplierDTO"/>

        <many-to-one class="net.dtopath.MarketDTO" column="MARKET_ID" name="marketDTO"/>

        <property name="price" type="float">
            <column name="PRICE" not-null="false"/>
        </property>    

        <property name="currency" type="string">
            <column name="CURRENCY" not-null="false"/>
        </property>

        <!-- Start of the bit that needs editing as it's wrong -->
        <join table="SUPPLIER_COVERAGE_SPECIAL_RULES">
            <key>
                <column name="SUPPLIER_ID" not-null="true" />
                <column name="MARKET_ID" not-null="true" />
            </key>
            <many-to-one name="specialRules" column="SUPPLIER_SPECIAL_RULE_ID" class="SupplierSpecialRuleDTO" not-null="true" />
        </join>
        <!-- End of the bit that needs editing as it's wrong -->
    </class>
</hibernate-mapping>

关于如何进行此映射的任何想法?

(是的,我需要在supplier_ID 和market_ID 上进行映射,而不是根据coverage_ID 来满足各种其他要求)。

编辑

我在其他地方发现了一个建议,即我应该使用属性来定义应该进行连接的键,例如:

<properties name="keysCoverageSpecialRules">
    <property name="supplierID" column="SUPPLIER_ID" insert="false" update="false"/>
    <property name="marketID" column="MARKET_ID" insert="false" update="false"/>
</properties>

<set name="specialRules" table="SUPPLIER_COVERAGE_SPECIAL_RULES">
    <key property-ref="keysCoverageSpecialRules">
    </key>
    <many-to-many class="SupplierSpecialRuleDTO" unique="true" column="SUPPLIER_SPECIAL_RULE_ID"/>
</set>

但这会给出错误“org.hibernate.MappingException:集合外键映射的列数错误:net.dtopath.CoverageDTO.specialRules 类型:component[supplierID,networkID]”

【问题讨论】:

    标签: hibernate join mapping many-to-one


    【解决方案1】:

    我想通了,其实很简单:

    <set name="specialRules" table="SUPPLIER_COVERAGE_SPECIAL_RULES" >
        <key column="MARKET_ID" />
    <many-to-many class="SupplierSpecialRuleDTO" unique="true" column="SUPPLIER_SPECIAL_RULE_ID" />
    </set>
    

    连接的每个步骤只需要一列用于连接。我试图一次告诉 hibernate 两列是错误的。

    我也错过了,因为 Hibernate 知道 SupplierSpecialRuleDTO 类,它知道该对象来自哪个表。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2011-10-25
      相关资源
      最近更新 更多