简体   繁体   English

JPA(休眠)使用n:m关联生成错误的查询

[英]JPA (Hibernate) generates wrong query using n:m association

I got a predefined oracle-db and I'm trying to map following tables: 我有一个预定义的oracle-db,我试图映射以下表:

TradingSeries: TradingSeries:

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

TradingSession: TradingSession:

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

The n:m association TradingComposition: n:m协会TradingComposition:

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

My corresponding mapping-classes: 我对应的映射类:

TradingSeries.class: 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: 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: 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: 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;

Now when I am trying to load a TradingSeries Hibernate executes following query: 现在,当我尝试加载TradingSeries时,Hibernate执行以下查询:

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 = ?

The result is an ORA-00972: identifier is too long , the problem is the generated tradingcom0_.tradingSession_TRADING_SESSION_ID . 结果是ORA-00972: identifier is too long ,问题是生成的tradingcom0_.tradingSession_TRADING_SESSION_ID This contains the String tradingSession_ which is wrong. 其中包含错误的字符串tradingSession_ Of course tradingcom0_.tradingSeries_TRADING_SERIES_ID is incorrect, too. 当然, tradingcom0_.tradingSeries_TRADING_SERIES_ID也不正确。 Also I'd like to know why hibernate selects the same fields multiple times (seen in the first rows in the query). 我也想知道为什么冬眠多次选择相同的字段(在查询的第一行中看到)。

Could anyone suggest me how to solve this problem? 谁能建议我如何解决这个问题? Ehy is hibernate using the wrong columnnames? 为什么休眠使用错误的列名?

Cheers, Philipp 菲利普干杯

Found the solution: 找到了解决方案:

Ged rid of 摆脱

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

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

In TradingComposition.class. 在TradingComposition.class中。 PrimaryKeyJoinColumn was a really bad idea and is not needed here. PrimaryKeyJoinColumn是一个非常糟糕的主意,这里不需要。 Instead change TradingCompositionId.class to: 而是将TradingCompositionId.class更改为:

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

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

and remove the long -attributes tradingsSeriesId and tradingSessionId . 并删除long属性tradingsSeriesIdtradingSessionId In TradingSeries.class and TradingSession.class change the annotation to @OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSeries") , respectively @OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSession") . 在TradingSeries.class和TradingSession.class改变批注@OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSeries")分别@OneToMany(fetch = FetchType.EAGER, mappedBy = "tradingCompositionId.tradingSession")

All this changes result in following SQL: 所有这些更改导致以下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 = ?

I still don't know why hibernate adds the multiple selects for attributes TRADING_SERIES_ID and TRADING_SESSION_ID... 我仍然不知道为什么冬眠为属性TRADING_SERIES_ID和TRADING_SESSION_ID添加多个选择...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM