【发布时间】:2018-03-20 15:56:00
【问题描述】:
我有一个基类的继承层次结构:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING)
abstract Instrument {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
@OneToMany(mappedBy = "instrument1", fetch = FetchType.LAZY)
List<Market> markets;
abstract Type getType(); // Type is an Enum containing Currency & Commodity
}
还有两个子类Commodity 和Currency 例如
@Entity
@DiscriminatorValue("CUR")
@PrimaryKeyJoinColumn(name = "INS_ID"))
public class Currency extends Instrument {
...
getType() {
returns Type.Currency;
}
}
每种工具都可以在多个市场上市:
@Entity
public class Market {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "INS_ID")
private Instrument instrument1; // Currency or Commodity listed on the market
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "CUR_ID")
private Currency instrument2; // Base currency of the market
}
我创建了一个CRUDRepository 方法来选择所有市场及其工具和基础货币:
@Query("SELECT m FROM Market m LEFT JOIN FETCH m.instrument1 LEFT JOIN FETCH m.instrument2")
public List<Market> findAllMarkets();
但由于某种原因,当我尝试执行以下操作时:
findAllMarkets()
.stream()
.filter(m -> m.getInstrument1().getType() == Type.Currency)
.map(m -> (Currency) m.getInstrument1())
.collect(toList());
我得到一个ClassCastException,因为Instrument1 实际上是Instrument 的代理类型,而不是我所期望的Currency。这似乎是间歇性发生的,有些是实际的 Currency 实例,有些是 instrument_$$_jvst965_19 代理。
有没有办法可以强制 Hibernate 不使用代理进行此查询?
【问题讨论】:
-
目前看来这与休眠会话缓存有关
标签: hibernate spring-data-jpa hql