我有字符串ID的實體:它N + 1時ID是串(JpaRepository)
@Table
@Entity
public class Stock {
@Id
@Column(nullable = false, length = 64)
private String index;
@Column(nullable = false)
private Integer price;
}
而且JpaRepository:
public interface StockRepository extends JpaRepository<Stock, String> {
}
當我打電話stockRepository::findAll
,我有N + 1
問題:
日誌簡化
select s.index,s.price from stock s
select s.index,s.price from stock s where where s.index =?
引用的最後一行調用大約5K次(表的大小)。另外,當我更新價格時,我在下一步:
stockRepository.save(listOfStocksWithUpdatedPrices);
在日誌中我有N
插入。
當id是數字時,我還沒有看到類似的行爲。
P.S.在我的情況下,將ID的類型設置爲數字不是最好的解決方案。
UPDATE1:
我忘了,更不用說還存在有許多對許多關係與Stock
Trade
類:
@Table
@Entity
public class Trade {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
@Enumerated(EnumType.STRING)
private TradeType type;
@Column
@Enumerated(EnumType.STRING)
private TradeState state;
@MapKey(name = "index")
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "trade_stock",
joinColumns = { @JoinColumn(name = "id", referencedColumnName = "id") },
inverseJoinColumns = { @JoinColumn(name = "stock_index", referencedColumnName = "index") })
private Map<String, Stock> stocks = new HashMap<>();
}
UPDATE2:
我加入了很多對 - 關係爲Stock
方:
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "stocks") //lazy by default
Set<Trade> trades = new HashSet<>();
但現在它離開了交易(但他們很懶),以及所有交易的收藏(他們也很懶)。但是,生成的Stock::toString
方法拋出了LazyInitializationException
異常。
請發佈整個股票類。 SQL說從股票s中選擇s.name,s.price,屬性名稱在哪裏? –
對不起,它是'索引'。我編輯了這個問題。 – Feeco
「日誌」是什麼意思是簡單的? –