Hibernate多列多对一连接映射

Hibernate多列多对一连接映射,hibernate,join,mapping,many-to-one,Hibernate,Join,Mapping,Many To One,我正在尝试使用Hibernate将一个表作为一组DTO映射到另一个DTO。我遇到了麻烦,因为我需要使用两列进行映射。请告诉我在hibernate映射文件中写什么来进行映射,因为无论我在映射的“连接”部分中放了什么,它都不被接受为有效格式 我试图用hibernate映射的DTO: 公共类CoverageDTO扩展BaseDTO{ private SupplierDTO supplierDTO; private MarketDTO marketDTO; private Float price;

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

我试图用hibernate映射的DTO:

公共类CoverageDTO扩展BaseDTO{

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

private Set<SpecialRuleDTO> specialRules = new HashSet<SpecialRuleDTO>(0);
供应商特殊规则表-列出可应用于供应商的特殊规则

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;
供应商覆盖范围特殊规则-列出应适用于供应商和市场的特殊规则

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级别考虑,我需要使用supplier_coverage_special_rules表中的信息,即通过匹配MARKET_ID和supplier_ID列,将supplier_special_规则映射到coverage表中。我认为下面的映射可以做到这一点,但它似乎不是有效的映射语法

<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>

关于如何进行这种映射有什么想法吗

(是的,我需要映射供应商ID和市场ID,而不是各种其他要求的覆盖范围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:collection外键映射的列数错误:net.dtopath.CoverageDTO.specialRules类型:component[supplierID,networkID]”

我找到了答案,其实很简单:

<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,它知道对象来自哪个表

<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>