【问题标题】:What is @Fetch annotation in hibernate?hibernate中的@Fetch注解是什么?
【发布时间】:2017-09-16 21:02:28
【问题描述】:
@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 有什么区别?

【问题讨论】:

    标签: hibernate jpa orm


    【解决方案1】:
    1. 如果这样 link 能帮你。
      1. 对于 CascadingType.DELETE 和 orphanRemoval

    级联删除

    使用 CascadeType.REMOVE(或 CascadeType.ALL, 其中包括 REMOVE) 表示删除操作应该是 自动级联到它所引用的实体对象 字段(一个集合可以引用多个实体对象 字段):

    @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,断开连接的 Address 实例将被自动删除。这对清理很有用 不应该存在的依赖对象(例如地址) 来自所有者对象(例如 Employee)的引用。

    • 如果仅指定 cascade=CascadeType.REMOVE,则不会采取自动操作,因为断开关系不是删除 操作。

    (级联删除和删除是同义词)

    来自here

    【讨论】:

    • 我个人不喜欢 orphanRemoval,如果删除操作是显式的,代码通常更容易阅读,并且可以避免额外的开销(JPA 必须遍历才能发现孤儿)。
    • 非常感谢它真的很有帮助。
    • 这并不完全正确 - cascade=CascadeType.REMOVE 确实对 db 有影响 - 它删除了外键。如果不采取行动,它会有什么意义?
    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 2011-06-13
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2015-01-15
    • 2015-05-12
    相关资源
    最近更新 更多