Spring Data JPA迁移XML persistence 到 Annotation persistence案例

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")})

猜你喜欢

转载自blog.csdn.net/weixin_37962025/article/details/80576771
今日推荐