![](/img/trans.png)
[英]how to write hibernate mapping for below table structure with composite primary key
[英]hibernate - how to properly generate .hbn.xml mapping files for a java class, which corresponds to a table with a composite primary key?
在我的PostgreSQL ERP数据库中,我有一个表“ Custtable”,它具有一个复合主键,由以下字段构成:
accountnum (String)
partition (Long)
dataareaid (String)
据我了解,由于这个复合键,我必须实现一个分离POJO,它将用作我的“ Custtable”休眠类的ID字段:
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;
}
然后,我可以在主类中使用此ID类:
@Entity
public class Custtable implements java.io.Serializable {
@Id
private CusttableId custTableId;
完成此操作后,当我使用Eclipse Hibernate Tools菜单为主类生成.hbn.xml映射文件时,将获得以下映射:
<?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>
如您所见,映射生成器有两个错误:1)标识不正确的ID; 2)它将CusttableId类解释为一对多关系,而不是将其用作Custtable类的ID。
处理此映射,将CusttableId类映射为Custtable类的ID的正确方法是什么?
您正在寻找EmbeddedId或IdClass: https ://docs.jboss.org/hibernate/orm/5.0/mappingGuide/zh-CN/html/ch06.html#identifiers-composite-nonaggregated
由于从提供的XML来看,您正在使用Hibernate 3,因此应查看以下示例: https : //docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-id
根据您的情况,您可以删除该类,并用以下内容替换不正确的关联:
<composite-id>
<key-property name="accountnum"/>
<key-property name="partition"/>
<key-property name="dataareaid"/>
</composite-id>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.