2015-03-02 66 views
0

我有一個預定義的Oracle數據庫,我試圖映射下表:JPA(休眠)用正產生錯誤的查詢:M協會

TradingSeries:

REF_TRADING_SERIES 
(
    TRADING_SERIES_ID NUMBER(15), 
    // other attributes 
) 

TradingSession:

REF_TRADING_SESSION 
(
    TRADING_SESSION_ID NUMBER(15), 
    // other attributes 
) 

的N:M關聯TradingComposition:

REF_TRADING_COMPOSITION 
(
    TRADING_SERIES_ID NUMBER(15), 
    TRADING_SESSION_ID NUMBER(15), 
    ITS     DATE, 
    UTS     DATE 
) 

我的相應的映射的類:

TradingSeries.class:

@Entity 
@Table(name = "REF_TRADING_SERIES", schema = "XXX") 
@Cacheable 
public class TradingSeries implements java.io.Serializable { 
    private static final long serialVersionUID = 1482491978920606855L; 
    private long tradingSeriesId; 
    // other attributes 
    private List<TradingComposition> tradingComposition = new ArrayList<TradingComposition>(0); 

    @Id 
    @Column(name = "TRADING_SERIES_ID", unique = true, nullable = false, precision = 15, scale = 0) 
    public long getTradeSessionId() { 
     return this.tradingSeriesId; 
    } 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSeriesId") 
    public List<TradingComposition> getTradingComposition() { 
     return tradingComposition; 
    } 

TradingSession.class:

@Entity 
@Table(name = "REF_TRADING_SESSION", schema = "XXX") 
public class TradingSession implements java.io.Serializable { 
    private static final long serialVersionUID = 9142731522041102660L; 
    private long tradingSessionId; 
    // other attributes 
    private List<TradingComposition> tradingComposition = new ArrayList<TradingComposition>(0); 

    @Id 
    @Column(name = "TRADING_SESSION_ID", unique = true, nullable = false, precision = 15, scale = 0) 
    public long gettradingSessionId() { 
     return this.tradingSessionId; 
    } 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSessionId") 
    public List<TradingComposition> getTradingComposition() { 
     return tradingComposition; 
    } 

TradingComposition.class:

@Entity 
@Table(name = "REF_TRADING_COMPOSITION", schema = "XXX") 
public class TradingComposition implements java.io.Serializable { 
    private static final long serialVersionUID = 9142731522041102660L; 

    @EmbeddedId 
    private TradingCompositionId tradingCompositionId; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "ITS", length = 7) 
    private Date its; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "UTS", length = 7) 
    private Date uts; 

    @ManyToOne 
    @PrimaryKeyJoinColumn(name = "TRADING_SERIES_ID") 
    private TradingSeries tradingSeries; 

    @ManyToOne 
    @PrimaryKeyJoinColumn(name = "TRADING_SESSION_ID") 
    private TradingSession tradingSession; 

TradingCompositionId.class:

@Embeddable 
public class TradingCompositionId implements Serializable {  
    private static final long serialVersionUID = -1546345156448039243L; 

    @Column(name = "TRADING_SERIES_ID", nullable = false, precision = 15, scale = 0) 
    private long tradingSeriesId; 

    @Column(name = "TRADING_SESSION_ID", nullable = false, precision = 15, scale = 0) 
    private long tradingSessionId; 

現在,當我試圖加載TradingSeries休眠執行以下查詢:

SELECT tradingcom0_.TRADING_SERIES_ID AS TRADING_SERIES_ID1_64_0_, 
     tradingcom0_.TRADING_SERIES_ID AS TRADING_SERIES_ID1_63_0_, 
     tradingcom0_.TRADING_SESSION_ID AS TRADING_SESSION_ID2_63_0_, 
     tradingcom0_.TRADING_SERIES_ID AS TRADING_SERIES_ID1_63_1_, 
     tradingcom0_.TRADING_SESSION_ID AS TRADING_SESSION_ID2_63_1_, 
     tradingcom0_.ITS AS ITS3_63_1_, 
     tradingcom0_.tradingSeries_TRADING_SERIES_ID 
      AS tradingSeries_TRAD5_63_1_, 
     tradingcom0_.tradingSession_TRADING_SESSION_ID 
      AS tradingSession_TRA6_63_1_, 
     tradingcom0_.UTS AS UTS4_63_1_, 
     tradingser1_.TRADING_SERIES_ID AS TRADING_SERIES_ID1_64_2_, 
     -- other attributes 
     tradingses2_.TRADING_SESSION_ID AS TRADING_SESSION_ID1_65_3_, 
     -- other attributes 
    FROM XXX.REF_TRADING_COMPOSITION tradingcom0_ 
     LEFT OUTER JOIN 
     XXX.REF_TRADING_SERIES tradingser1_ 
      ON tradingcom0_.tradingSeries_TRADING_SERIES_ID = 
       tradingser1_.TRADING_SERIES_ID 
     LEFT OUTER JOIN 
     XXX.REF_TRADING_SESSION tradingses2_ 
      ON tradingcom0_.tradingSession_TRADING_SESSION_ID = 
       tradingses2_.TRADING_SESSION_ID 
WHERE tradingcom0_.TRADING_SERIES_ID = ? 

結果是ORA-00972: identifier is too long,問題是產生tradingcom0_.tradingSession_TRADING_SESSION_ID。這包含字符串tradingSession_這是錯誤的。當然tradingcom0_.tradingSeries_TRADING_SERIES_ID也是不正確的。另外我想知道爲什麼hibernate多次選擇相同的字段(在查詢的第一行中可以看到)。

任何人都可以建議我如何解決這個問題? Ehy使用錯誤的列名來休眠?

乾杯, 菲利普

回答

1

找到了解決方案:

蓋德擺脫

@ManyToOne 
@PrimaryKeyJoinColumn(name = "TRADING_SERIES_ID") 
private TradingSeries tradingSeries; 

@ManyToOne 
@PrimaryKeyJoinColumn(name = "TRADING_SESSION_ID") 
private TradingSession tradingSession; 

在TradingComposition.class。 PrimaryKeyJoinColumn是一個非常糟糕的主意,在這裏不需要。相反,改變TradingCompositionId.class到:

@ManyToOne 
@JoinColumn(name = "TRADING_SERIES_ID", nullable = false) 
private TradingSeries tradingSeries; 

@ManyToOne 
@JoinColumn(name = "TRADING_SESSION_ID", nullable = false) 
private TradingSession tradingSession; 

並取出long -attributes tradingsSeriesIdtradingSessionId。 在TradingSeries.class和TradingSession.class中分別將註釋更改爲@OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSeries"),分別爲@OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSession")

所有這些變化導致下面的SQL:

SELECT tradingcom0_.TRADING_SERIES_ID AS TRADING_SERIES_ID4_64_0_, 
     tradingcom0_.TRADING_SERIES_ID AS TRADING_SERIES_ID4_63_0_, 
     tradingcom0_.TRADING_SESSION_ID AS TRADING_SESSION_ID3_63_0_, 
     tradingcom0_.TRADING_SERIES_ID AS TRADING_SERIES_ID4_63_1_, 
     tradingcom0_.TRADING_SESSION_ID AS TRADING_SESSION_ID3_63_1_, 
     tradingcom0_.ITS AS ITS1_63_1_, 
     tradingcom0_.UTS AS UTS2_63_1_, 
     tradingser1_.TRADING_SERIES_ID AS TRADING_SERIES_ID1_64_2_, 
     -- other attributes 
     tradingses2_.TRADING_SESSION_ID AS TRADING_SESSION_ID1_65_3_, 
     -- other attributes 
    FROM XXX.REF_TRADING_COMPOSITION tradingcom0_ 
     LEFT OUTER JOIN 
     XXX.REF_TRADING_SERIES tradingser1_ 
      ON tradingcom0_.TRADING_SERIES_ID = 
       tradingser1_.TRADING_SERIES_ID 
     LEFT OUTER JOIN 
     XXX.REF_TRADING_SESSION tradingses2_ 
      ON tradingcom0_.TRADING_SESSION_ID = 
       tradingses2_.TRADING_SESSION_ID 
    WHERE tradingcom0_.TRADING_SERIES_ID = ? 

我仍然不知道爲什麼休眠增加了多個選擇的屬性TRADING_SERIES_ID和TRADING_SESSION_ID ...