---
# System prepended metadata

title: '[Hibernate] 使用上需注意(待整理)'
tags: ["Hibernate\_", Java]

---

# [Hibernate] 使用上需注意(待整理)

Hibernate 雖能透過物件操作資料庫，讓開發更加便利，但有些使用上會影響效能，以致需要注意的地方

## 一、FetchType
在透過@OneToMany、@ManyToOne、@ManyToMany、@OneToOne 以上四種 Annotation 來建立關聯時，可以透過 FetchType 來定義如何載入關聯的資料表

```=java!
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(
    name = "PRODUCT",
    joinColumns = @JoinColumn(name = "ID", referencedColumnName = "NO"),
    inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID", referencedColumnName = "PRODUCT_ID"))
private Set<Product> Products = new HashSet<>();
```

但若 @ManyToOne、@OneToOne 無指定 FetchType，Hibernate 預設會是 EAGER。
EAGER會主動對關聯的資料表進行額外的查詢，如需要一次載入多筆資資料，將會產生大量額外的查詢(指的是這些關聯join的表)，並對資料庫產生負擔。

https://www.tpisoftware.com/tpu/articleDetails/1152