简体   繁体   中英

hibernate - how to properly generate .hbn.xml mapping files for a java class, which corresponds to a table with a composite primary key?

In my PostgreSQL ERP database, I have a table "Custtable", which has a composite primary key, made from the following fields:

accountnum (String)
partition (Long)
dataareaid (String)

As I understand, because of this composite key, I have to implement a separat POJO, which will serve as the ID field for my "Custtable" hibernate class:

public class CusttableId {

    private String accountnum;
    private Long partition;
    private String dataareaid;

    public CusttableId(){

    }

    public String getAccountnum(){
        return accountnum;
    }

    public void setAccountnum( String an ) {
           accountnum = an;
        }

    public Long getPartition(){
        return partition;
    }

    public void setPartition(Long part){
        partition = part;
    }

Then, I can use this ID class in my main class:

@Entity
public class Custtable implements java.io.Serializable {

    @Id
    private CusttableId custTableId;

Having done that, when I use Eclipse Hibernate Tools menu to generate the .hbn.xml mapping file for my main class, I get the following mapping:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 7, 2016 10:15:45 AM by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.myproject.Custtable" table="CUSTTABLE">
        <id name="orgid" type="java.lang.String">
            <column name="ORGID" />
            <generator class="assigned" />
        </id>
        <many-to-one name="custTableId" class="com.uptake.symphony.data.CusttableId" access="field" fetch="join">
            <column name="CUSTTABLEID" />
        </many-to-one>
        <property name="invoiceaccount" type="java.lang.String">
            <column name="INVOICEACCOUNT" />
        </property>
        <property name="custgroup" type="java.lang.String">
            <column name="CUSTGROUP" />
        </property>
        <property name="linedisc" type="java.lang.String">
            <column name="LINEDISC" />
        </property>
        <property name="paymtermid" type="java.lang.String">
            <column name="PAYMTERMID" />
        </property>
        <property name="cashdisc" type="java.lang.String">
            <column name="CASHDISC" />
        </property>
        <property name="currency" type="java.lang.String">
            <column name="CURRENCY" />
        </property>
        <property name="intercompanyautocreateorders" type="int">
            <column name="INTERCOMPANYAUTOCREATEORDERS" />
        </property>
        <property name="salesgroup" type="java.lang.String">
            <column name="SALESGROUP" />
        </property>
        <property name="blocked" type="int">
            <column name="BLOCKED" />
        </property>
        <property name="onetimecustomer" type="int">
            <column name="ONETIMECUSTOMER" />
        </property>
        <property name="accountstatement" type="int">
            <column name="ACCOUNTSTATEMENT" />
        </property>
        <property name="creditmax" type="java.math.BigDecimal">
            <column name="CREDITMAX" />
        </property>
        <property name="mandatorycreditlimit" type="int">
            <column name="MANDATORYCREDITLIMIT" />
        </property>
        <property name="vendaccount" type="java.lang.String">
            <column name="VENDACCOUNT" />
        </property>
        <property name="pricegroup" type="java.lang.String">
            <column name="PRICEGROUP" />
        </property>
        <property name="multilinedisc" type="java.lang.String">
            <column name="MULTILINEDISC" />
        </property>
        <property name="enddisc" type="java.lang.String">
            <column name="ENDDISC" />
        </property>
        <property name="vatnum" type="java.lang.String">
            <column name="VATNUM" />
        </property>
        <property name="inventlocation" type="java.lang.String">
            <column name="INVENTLOCATION" />
        </property>
        <property name="dlvterm" type="java.lang.String">
            <column name="DLVTERM" />
        </property>
        <property name="dlvmode" type="java.lang.String">
            <column name="DLVMODE" />
        </property>
        <property name="markupgroup" type="java.lang.String">
            <column name="MARKUPGROUP" />
        </property>
        <property name="clearingperiod" type="java.lang.String">
            <column name="CLEARINGPERIOD" />
        </property>
        <property name="freightzone" type="java.lang.String">
            <column name="FREIGHTZONE" />
        </property>
        <property name="creditrating" type="java.lang.String">
            <column name="CREDITRATING" />
        </property>
        <property name="taxgroup" type="java.lang.String">
            <column name="TAXGROUP" />
        </property>
        <property name="statisticsgroup" type="java.lang.String">
            <column name="STATISTICSGROUP" />
        </property>
        <property name="paymmode" type="java.lang.String">
            <column name="PAYMMODE" />
        </property>
        <property name="commissiongroup" type="java.lang.String">
            <column name="COMMISSIONGROUP" />
        </property>
        <property name="bankaccount" type="java.lang.String">
            <column name="BANKACCOUNT" />
        </property>
        <property name="paymsched" type="java.lang.String">
            <column name="PAYMSCHED" />
        </property>
        <property name="contactpersonid" type="java.lang.String">
            <column name="CONTACTPERSONID" />
        </property>
        <property name="invoiceaddress" type="int">
            <column name="INVOICEADDRESS" />
        </property>
        <property name="ouraccountnum" type="java.lang.String">
            <column name="OURACCOUNTNUM" />
        </property>
        <property name="salespoolid" type="java.lang.String">
            <column name="SALESPOOLID" />
        </property>
        <property name="incltax" type="int">
            <column name="INCLTAX" />
        </property>
        <property name="custitemgroupid" type="java.lang.String">
            <column name="CUSTITEMGROUPID" />
        </property>
        <property name="numbersequencegroup" type="java.lang.String">
            <column name="NUMBERSEQUENCEGROUP" />
        </property>
        <property name="paymdayid" type="java.lang.String">
            <column name="PAYMDAYID" />
        </property>
        <property name="lineofbusinessid" type="java.lang.String">
            <column name="LINEOFBUSINESSID" />
        </property>
        <property name="destinationcodeid" type="java.lang.String">
            <column name="DESTINATIONCODEID" />
        </property>
        <property name="girotype" type="int">
            <column name="GIROTYPE" />
        </property>
        <property name="suppitemgroupid" type="java.lang.String">
            <column name="SUPPITEMGROUPID" />
        </property>
        <property name="girotypeinterestnote" type="int">
            <column name="GIROTYPEINTERESTNOTE" />
        </property>
        <property name="taxlicensenum" type="java.lang.String">
            <column name="TAXLICENSENUM" />
        </property>
        <property name="websalesorderdisplay" type="int">
            <column name="WEBSALESORDERDISPLAY" />
        </property>
        <property name="paymspec" type="java.lang.String">
            <column name="PAYMSPEC" />
        </property>
        <property name="bankcentralbankpurposetext" type="java.lang.String">
            <column name="BANKCENTRALBANKPURPOSETEXT" />
        </property>
        <property name="bankcentralbankpurposecode" type="java.lang.String">
            <column name="BANKCENTRALBANKPURPOSECODE" />
        </property>
        <property name="intercompanyallowindirectcreation" type="int">
            <column name="INTERCOMPANYALLOWINDIRECTCREATION" />
        </property>
        <property name="packmaterialfeelicensenum" type="java.lang.String">
            <column name="PACKMATERIALFEELICENSENUM" />
        </property>
        <property name="taxbordernumberFi" type="java.lang.String">
            <column name="TAXBORDERNUMBERFI" />
        </property>
        <property name="einvoiceeannum" type="java.lang.String">
            <column name="EINVOICEEANNUM" />
        </property>
        <property name="fiscalcode" type="java.lang.String">
            <column name="FISCALCODE" />
        </property>
        <property name="dlvreason" type="java.lang.String">
            <column name="DLVREASON" />
        </property>
        <property name="forecastdmpinclude" type="int">
            <column name="FORECASTDMPINCLUDE" />
        </property>
        <property name="girotypecollectionletter" type="int">
            <column name="GIROTYPECOLLECTIONLETTER" />
        </property>
        <property name="salescalendarid" type="java.lang.String">
            <column name="SALESCALENDARID" />
        </property>
        <property name="custclassificationid" type="java.lang.String">
            <column name="CUSTCLASSIFICATIONID" />
        </property>
        <property name="intercompanydirectdelivery" type="int">
            <column name="INTERCOMPANYDIRECTDELIVERY" />
        </property>
        <property name="enterprisenumber" type="java.lang.String">
            <column name="ENTERPRISENUMBER" />
        </property>
        <property name="shipcarrieraccount" type="java.lang.String">
            <column name="SHIPCARRIERACCOUNT" />
        </property>
        <property name="girotypeprojinvoice" type="int">
            <column name="GIROTYPEPROJINVOICE" />
        </property>
        <property name="inventsiteid" type="java.lang.String">
            <column name="INVENTSITEID" />
        </property>
        <property name="orderentrydeadlinegroupid" type="java.lang.String">
            <column name="ORDERENTRYDEADLINEGROUPID" />
        </property>
        <property name="shipcarrierid" type="java.lang.String">
            <column name="SHIPCARRIERID" />
        </property>
        <property name="shipcarrierfuelsurcharge" type="int">
            <column name="SHIPCARRIERFUELSURCHARGE" />
        </property>
        <property name="shipcarrierblindshipment" type="int">
            <column name="SHIPCARRIERBLINDSHIPMENT" />
        </property>
        <property name="shipcarrieraccountcode" type="java.lang.String">
            <column name="SHIPCARRIERACCOUNTCODE" />
        </property>
        <property name="girotypefreetextinvoice" type="int">
            <column name="GIROTYPEFREETEXTINVOICE" />
        </property>
        <property name="syncentityid" type="java.lang.String">
            <column name="SYNCENTITYID" />
        </property>
        <property name="syncversion" type="long">
            <column name="SYNCVERSION" />
        </property>
        <property name="memo" type="java.lang.String">
            <column name="MEMO" />
        </property>
        <property name="salesdistrictid" type="java.lang.String">
            <column name="SALESDISTRICTID" />
        </property>
        <property name="segmentid" type="java.lang.String">
            <column name="SEGMENTID" />
        </property>
        <property name="subsegmentid" type="java.lang.String">
            <column name="SUBSEGMENTID" />
        </property>
        <property name="rfiditemtagging" type="int">
            <column name="RFIDITEMTAGGING" />
        </property>
        <property name="rfidcasetagging" type="int">
            <column name="RFIDCASETAGGING" />
        </property>
        <property name="rfidpallettagging" type="int">
            <column name="RFIDPALLETTAGGING" />
        </property>
        <property name="companychainid" type="java.lang.String">
            <column name="COMPANYCHAINID" />
        </property>
        <property name="companyidsiret" type="java.lang.String">
            <column name="COMPANYIDSIRET" />
        </property>
        <property name="party" type="long">
            <column name="PARTY" />
        </property>
        <property name="identificationnumber" type="java.lang.String">
            <column name="IDENTIFICATIONNUMBER" />
        </property>
        <property name="partycountry" type="java.lang.String">
            <column name="PARTYCOUNTRY" />
        </property>
        <property name="partystate" type="java.lang.String">
            <column name="PARTYSTATE" />
        </property>
        <property name="paymidtype" type="java.lang.String">
            <column name="PAYMIDTYPE" />
        </property>
        <property name="factoringaccount" type="java.lang.String">
            <column name="FACTORINGACCOUNT" />
        </property>
        <property name="defaultdimension" type="long">
            <column name="DEFAULTDIMENSION" />
        </property>
        <property name="custexcludecollectionfee" type="int">
            <column name="CUSTEXCLUDECOLLECTIONFEE" />
        </property>
        <property name="custexcludeinterestcharges" type="int">
            <column name="CUSTEXCLUDEINTERESTCHARGES" />
        </property>
        <property name="companynafcode" type="long">
            <column name="COMPANYNAFCODE" />
        </property>
        <property name="bankcustpaymidtable" type="long">
            <column name="BANKCUSTPAYMIDTABLE" />
        </property>
        <property name="girotypeaccountstatement" type="int">
            <column name="GIROTYPEACCOUNTSTATEMENT" />
        </property>
        <property name="maincontactworker" type="long">
            <column name="MAINCONTACTWORKER" />
        </property>
        <property name="creditcardaddressverification" type="int">
            <column name="CREDITCARDADDRESSVERIFICATION" />
        </property>
        <property name="creditcardcvc" type="int">
            <column name="CREDITCARDCVC" />
        </property>
        <property name="creditcardaddressverificationvoid" type="int">
            <column name="CREDITCARDADDRESSVERIFICATIONVOID" />
        </property>
        <property name="creditcardaddressverificationlevel" type="int">
            <column name="CREDITCARDADDRESSVERIFICATIONLEVEL" />
        </property>
        <property name="companytypeMx" type="int">
            <column name="COMPANYTYPEMX" />
        </property>
        <property name="rfcMx" type="java.lang.String">
            <column name="RFCMX" />
        </property>
        <property name="curpMx" type="java.lang.String">
            <column name="CURPMX" />
        </property>
        <property name="stateinscriptionMx" type="java.lang.String">
            <column name="STATEINSCRIPTIONMX" />
        </property>
        <property name="residenceforeigncountryregionidIt" type="java.lang.String">
            <column name="RESIDENCEFOREIGNCOUNTRYREGIONIDIT" />
        </property>
        <property name="birthcountycodeIt" type="java.lang.String">
            <column name="BIRTHCOUNTYCODEIT" />
        </property>
        <property name="birthdateIt" type="java.util.Date">
            <column name="BIRTHDATEIT" />
        </property>
        <property name="birthplaceIt" type="java.lang.String">
            <column name="BIRTHPLACEIT" />
        </property>
        <property name="einvoice" type="int">
            <column name="EINVOICE" />
        </property>
        <property name="ccmnumBr" type="java.lang.String">
            <column name="CCMNUMBR" />
        </property>
        <property name="cnpjcpfnumBr" type="java.lang.String">
            <column name="CNPJCPFNUMBR" />
        </property>
        <property name="pbacustgroupid" type="java.lang.String">
            <column name="PBACUSTGROUPID" />
        </property>
        <property name="ienumBr" type="java.lang.String">
            <column name="IENUMBR" />
        </property>
        <property name="suframanumberBr" type="java.lang.String">
            <column name="SUFRAMANUMBERBR" />
        </property>
        <property name="suframaBr" type="int">
            <column name="SUFRAMABR" />
        </property>
        <property name="custfinaluserBr" type="int">
            <column name="CUSTFINALUSERBR" />
        </property>
        <property name="interestcodeBr" type="java.lang.String">
            <column name="INTERESTCODEBR" />
        </property>
        <property name="finecodeBr" type="java.lang.String">
            <column name="FINECODEBR" />
        </property>
        <property name="suframapiscofinsBr" type="int">
            <column name="SUFRAMAPISCOFINSBR" />
        </property>
        <property name="taxwithholdcalculateTh" type="int">
            <column name="TAXWITHHOLDCALCULATETH" />
        </property>
        <property name="taxwithholdgroupTh" type="java.lang.String">
            <column name="TAXWITHHOLDGROUPTH" />
        </property>
        <property name="consdayJp" type="int">
            <column name="CONSDAYJP" />
        </property>
        <property name="nitBr" type="java.lang.String">
            <column name="NITBR" />
        </property>
        <property name="inssceiBr" type="java.lang.String">
            <column name="INSSCEIBR" />
        </property>
        <property name="cnaeBr" type="java.lang.String">
            <column name="CNAEBR" />
        </property>
        <property name="icmscontributorBr" type="int">
            <column name="ICMSCONTRIBUTORBR" />
        </property>
        <property name="servicecodeondlvaddressBr" type="int">
            <column name="SERVICECODEONDLVADDRESSBR" />
        </property>
        <property name="inventprofiletypeRu" type="int">
            <column name="INVENTPROFILETYPERU" />
        </property>
        <property name="inventprofileidRu" type="java.lang.String">
            <column name="INVENTPROFILEIDRU" />
        </property>
        <property name="taxwithholdcalculateIn" type="int">
            <column name="TAXWITHHOLDCALCULATEIN" />
        </property>
        <property name="unitedvatinvoiceLt" type="int">
            <column name="UNITEDVATINVOICELT" />
        </property>
        <property name="enterprisecode" type="java.lang.String">
            <column name="ENTERPRISECODE" />
        </property>
        <property name="commercialregistersection" type="java.lang.String">
            <column name="COMMERCIALREGISTERSECTION" />
        </property>
        <property name="commercialregisterinsetnumber" type="java.lang.String">
            <column name="COMMERCIALREGISTERINSETNUMBER" />
        </property>
        <property name="commercialregister" type="java.lang.String">
            <column name="COMMERCIALREGISTER" />
        </property>
        <property name="regnumW" type="java.lang.String">
            <column name="REGNUMW" />
        </property>
        <property name="isresidentLv" type="int">
            <column name="ISRESIDENTLV" />
        </property>
        <property name="intbankLv" type="java.lang.String">
            <column name="INTBANKLV" />
        </property>
        <property name="paymentreferenceEe" type="java.lang.String">
            <column name="PAYMENTREFERENCEEE" />
        </property>
        <property name="packagedepositexcemptPl" type="int">
            <column name="PACKAGEDEPOSITEXCEMPTPL" />
        </property>
        <property name="fednonfedindicator" type="int">
            <column name="FEDNONFEDINDICATOR" />
        </property>
        <property name="irs1099cindicator" type="int">
            <column name="IRS1099CINDICATOR" />
        </property>
        <property name="agencylocationcode" type="java.lang.String">
            <column name="AGENCYLOCATIONCODE" />
        </property>
        <property name="federalcomments" type="java.lang.String">
            <column name="FEDERALCOMMENTS" />
        </property>
        <property name="usepurchrequest" type="int">
            <column name="USEPURCHREQUEST" />
        </property>
        <property name="mcrmergedparent" type="java.lang.String">
            <column name="MCRMERGEDPARENT" />
        </property>
        <property name="mcrmergedroot" type="java.lang.String">
            <column name="MCRMERGEDROOT" />
        </property>
        <property name="affiliatedRu" type="int">
            <column name="AFFILIATEDRU" />
        </property>
        <property name="cashdiscbasedays" type="int">
            <column name="CASHDISCBASEDAYS" />
        </property>
        <property name="custtradingpartnercode" type="long">
            <column name="CUSTTRADINGPARTNERCODE" />
        </property>
        <property name="custwhtcontributiontypeBr" type="int">
            <column name="CUSTWHTCONTRIBUTIONTYPEBR" />
        </property>
        <property name="daxintegrationid" type="java.lang.String">
            <column name="DAXINTEGRATIONID" />
        </property>
        <property name="defaultdirectdebitmandate" type="long">
            <column name="DEFAULTDIRECTDEBITMANDATE" />
        </property>
        <property name="defaultinventstatusid" type="java.lang.String">
            <column name="DEFAULTINVENTSTATUSID" />
        </property>
        <property name="entrycertificaterequiredW" type="int">
            <column name="ENTRYCERTIFICATEREQUIREDW" />
        </property>
        <property name="exportsalesPl" type="int">
            <column name="EXPORTSALESPL" />
        </property>
        <property name="expressbilloflading" type="int">
            <column name="EXPRESSBILLOFLADING" />
        </property>
        <property name="fiscaldoctypePl" type="int">
            <column name="FISCALDOCTYPEPL" />
        </property>
        <property name="foreignresidentRu" type="int">
            <column name="FOREIGNRESIDENTRU" />
        </property>
        <property name="generateincomingfiscaldocumentBr" type="int">
            <column name="GENERATEINCOMINGFISCALDOCUMENTBR" />
        </property>
        <property name="invoicepostingtypeRu" type="int">
            <column name="INVOICEPOSTINGTYPERU" />
        </property>
        <property name="issueownentrycertificateW" type="int">
            <column name="ISSUEOWNENTRYCERTIFICATEW" />
        </property>
        <property name="issuercountryHu" type="java.lang.String">
            <column name="ISSUERCOUNTRYHU" />
        </property>
        <property name="lvpaymtranscodes" type="long">
            <column name="LVPAYMTRANSCODES" />
        </property>
        <property name="mandatoryvatdatePl" type="int">
            <column name="MANDATORYVATDATEPL" />
        </property>
        <property name="passportnoHu" type="java.lang.String">
            <column name="PASSPORTNOHU" />
        </property>
        <property name="pdscustrebategroupid" type="java.lang.String">
            <column name="PDSCUSTREBATEGROUPID" />
        </property>
        <property name="pdsfreightaccrued" type="int">
            <column name="PDSFREIGHTACCRUED" />
        </property>
        <property name="pdsrebatetmagroup" type="java.lang.String">
            <column name="PDSREBATETMAGROUP" />
        </property>
        <property name="taxperiodpaymentcodePl" type="java.lang.String">
            <column name="TAXPERIODPAYMENTCODEPL" />
        </property>
        <property name="usecashdisc" type="int">
            <column name="USECASHDISC" />
        </property>
        <property name="modifieddatetime" type="java.util.Date">
            <column name="MODIFIEDDATETIME" />
        </property>
        <property name="delModifiedtime" type="int">
            <column name="DELMODIFIEDTIME" />
        </property>
        <property name="modifiedby" type="java.lang.String">
            <column name="MODIFIEDBY" />
        </property>
        <property name="createddatetime" type="java.util.Date">
            <column name="CREATEDDATETIME" />
        </property>
        <property name="delCreatedtime" type="int">
            <column name="DELCREATEDTIME" />
        </property>
        <property name="dataareaid" type="java.lang.String">
            <column name="DATAAREAID" />
        </property>
        <property name="recversion" type="int">
            <column name="RECVERSION" />
        </property>
        <property name="partition" type="long">
            <column name="PARTITION" />
        </property>
        <property name="recid" type="long">
            <column name="RECID" />
        </property>
        <property name="einvoiceregisterIt" type="int">
            <column name="EINVOICEREGISTERIT" />
        </property>
        <property name="foreigneridBr" type="java.lang.String">
            <column name="FOREIGNERIDBR" />
        </property>
        <property name="authorityofficeIt" type="java.lang.String">
            <column name="AUTHORITYOFFICEIT" />
        </property>
        <property name="presencetypeBr" type="int">
            <column name="PRESENCETYPEBR" />
        </property>
        <property name="taxgstreliefgroupheadingMy" type="long">
            <column name="TAXGSTRELIEFGROUPHEADINGMY" />
        </property>
    </class>
</hibernate-mapping>

As you can see, the mapping generator gets two things wrong: 1) it identifies an incorrect id; 2) it interprets the CusttableId class as a one-to-many relationship, rather then using it as the id for the Custtable class.

What is the proper way to handle this mapping, to have the CusttableId class mapped as the id for the Custtable class?

You're looking for EmbeddedId or IdClass: https://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html/ch06.html#identifiers-composite-nonaggregated

Since judging by provided XML you're using Hibernate 3, you should look into that example: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-id

In your case you can remove the class and replace incorrect association with:

<composite-id> 
   <key-property name="accountnum"/> 
   <key-property name="partition"/> 
   <key-property name="dataareaid"/> 
</composite-id>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM