我試圖使用Hibernate將表映射爲一組DTO到另一個DTO。我遇到了麻煩,因爲我需要使用兩列進行映射。請大家告訴我在hibernate映射文件中寫什麼來完成映射,因爲無論我放入映射的「連接」部分,它都不會被接受爲有效格式。Hibernate連接映射多對一,多列
的DTO我試圖與Hibernate映射:
公共類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層次的思考,我需要使用在supplier_coverage_special_rules表即信息通過匹配MARKET_ID和SUPPLIER_ID列於supplier_special_rules映射到覆蓋表。我雖然下面的映射會做到這一點,但它似乎不是一個有效的映射語法。
<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>
但這給出一個錯誤「組織。 hibernate.MappingException:收集外鍵映射具有錯誤的列數:net.dtopath.CoverageDTO.specialRules類型:成分[供應商ID,網絡ID]」