2017-04-20 90 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

非常感谢你的帮助。 –