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 2014-8-6 14:40:28 by SYNNEX Customized Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.synnex.persistence.orm.track.ShipmentTrackHeader" table="hyve_shipment_track_header" catalog="HYVE"> <composite-id name="id" class="com.synnex.persistence.orm.track.ShipmentTrackHeaderId"> <key-property name="trackingNo" type="string"> <column name="tracking_no" length="100"/> </key-property> <key-property name="regionNo" type="integer"> <column name="region_no"/> </key-property> </composite-id> <version name="HVersion" type="integer" unsaved-value="null"> <column name="h_version" not-null="true"/> </version> <property name="carrierName" type="string"> <column name="carrier_name" length="30"/> </property> <property name="shipMethod" type="string"> <column name="ship_method" length="4"/> </property> <property name="shipper" type="string"> <column name="shipper" length="30"/> </property> <property name="consignee" type="string"> <column name="consignee" length="30"/> </property> <property name="shipFrom" type="string"> <column name="ship_from" length="300"/> </property> <property name="shipTo" type="string"> <column name="ship_to" length="300"/> </property> <property name="shipDate" type="timestamp"> <column name="ship_date" length="23"/> </property> <property name="expectedDelivery" type="timestamp"> <column name="expected_delivery" length="23"/> </property> <property name="actualDelivery" type="timestamp"> <column name="actual_delivery" length="23"/> </property> <property name="status" type="string"> <column name="status" length="10"/> </property> <property name="bookNo" type="string"> <column name="book_no" length="30"/> </property> <property name="entryId" type="integer"> <column name="entry_id" not-null="true"/> </property> <property name="entryDatetime" type="timestamp"> <column name="entry_datetime" length="23" not-null="true"/> </property> <set name="historyList" cascade="all-delete-orphan" lazy="false" inverse="true" order-by="event_datetime desc"> <key not-null="true"> <column name="tracking_no"/> <column name="region_no"/> </key> <one-to-many class="com.synnex.persistence.orm.track.ShipmentTrackHistory"/> </set> </class> </hibernate-mapping>
注释版配置
package com.synnex.persistence.orm.track; import java.util.Date; import java.util.LinkedHashSet; import java.util.Set; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.JoinColumns; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.FetchType; @Entity @Table(name = "hyve_shipment_track_header") public class ShipmentTrackHeader implements java.io.Serializable { private static final long serialVersionUID = -4958350967593775625L; @EmbeddedId private ShipmentTrackHeaderId id; @Column(name = "h_version") private Integer HVersion; @Column(name = "carrier_name") private String carrierName; @Column(name = "ship_method") private String shipMethod; @Column(name = "shipper") private String shipper; @Column(name = "consignee") private String consignee; @Column(name = "ship_from") private String shipFrom; @Column(name = "ship_to") private String shipTo; @Column(name = "ship_date") private Date shipDate; @Column(name = "expected_delivery") private Date expectedDelivery; @Column(name = "actual_delivery") private Date actualDelivery; @Column(name = "status") private String status; @Column(name = "entry_id") private Integer entryId; @Column(name = "entry_datetime") private Date entryDatetime; @Column(name = "book_no") private String bookNo; public String getBookNo() { return bookNo; } public void setBookNo(String bookNo) { this.bookNo = bookNo; } @OneToMany(targetEntity = ShipmentTrackHistory.class, fetch = FetchType.EAGER) @Cascade(CascadeType.ALL) @JoinColumns( {@JoinColumn(name = "region_no"), @JoinColumn(name = "tracking_no")}) private Set<ShipmentTrackHistory> historyList; public ShipmentTrackHeader() { } ......
这里一定要注意JoinColumn的顺序,顺序不同将导致hibernate执行的JOIN关联参数顺序不同。
@OneToMany(targetEntity = ShipmentTrackHistory.class, fetch = FetchType.EAGER) @Cascade(CascadeType.ALL) @JoinColumns( {@JoinColumn(name = "tracking_no"), @JoinColumn(name = "region_no")}) private Set<ShipmentTrackHistory> historyList;
上面是一个错误的例子,那么在上面配置的基础上,hibernate运行的SQL如下:
SELECT * FROM hyve_shipment_track_header a LEFT OUTER JOIN hyve_shipment_track_history b ON a.region_no = b.tracking_no AND a.tracking_no = b.region_no LEFT OUTER JOIN hyve_shipment_track_his_info addinfolis2_ ON b.region_no = addinfolis2_.tracking_no AND b.tracking_line_no = addinfolis2_.tracking_line_no AND b.tracking_no = addinfolis2_.region_no WHERE a.region_no = 10001 AND a.tracking_no = 'GXY00001414'; 可以看到,ON后面关联的region_no tracking_no关联全乱了,所以需要调换JoinColumns里面的顺序:
@JoinColumns( {@JoinColumn(name = "region_no"), @JoinColumn(name = "tracking_no")})