2017-04-20 93 views
2
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
@Fetch(FetchMode.SUBSELECT) 
@JoinColumn(name = "ORU_OAUTH_ID", nullable = false) 
@OrderBy("ORU_ORDER ") 
private List<RedirectedURLs> acceptedReturnUrls; 
  1. 在這段代碼中,我想了解@Fetch(FetchMode.SUBSELECT)是做什麼的?
  2. orphanRemoval和CascadeType.DELETE有什麼區別?

回答

2
  1. 如果 link 可以幫助你。
  2. 對於CascadingType.DELETE和orphanRemoval

級聯刪除

標記與CascadeType.REMOVE(或CascadeType.ALL參考場, 其中包含REMOVE)指示刪除操作應自動級聯到 f被該實體對象引用 f ield(多個實體對象可通過一個集合 域引用):

@Entity 
class Employee { 
    : 
    @OneToOne(cascade=CascadeType.REMOVE) 
    private Address address; 
    : 
} 

孤兒去除

JPA 2支持其可使用的orphanRemoval元素指定的附加的和更積極的刪除級聯模式在 @OneToOne與@OneToMany註釋:

@Entity 
class Employee { 
    : 
    @OneToOne(orphanRemoval=true) 
    private Address address; 
    : 
} 

區別: -

兩個設置之間的區別在於斷開關係的響應。例如,如將 地址字段設置爲空或另一個地址對象時。

  • 如果指定orphanRemoval = true,則斷開的地址實例將自動刪除。這對清理 相關對象(例如地址)非常有用,該對象在所有者對象(例如Employee)沒有 引用時不應存在。

  • 如果只指定cascade = CascadeType.REMOVE,則由於斷開關係而不採取自動操作,因此不會刪除 操作。

(級聯刪除和刪除是synonyme)

here從。

+0

我個人不喜歡orphanRemoval,如果remove操作是顯式的,那麼代碼通常更容易閱讀,並且避免了額外的開銷(JPA必須遍歷才能發現孤兒)。 –

+0

非常感謝你的幫助。 –