我有一個預定義的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使用錯誤的列名來休眠?
乾杯, 菲利普