java - 如何在hibernate注解中使用级联类型保存、删除、更新

标签 java hibernate

任何人都可以向我解释 hibernate 注解如何使用不同类型的级联,如删除、更新、保存更新吗?

我怎样才能确保当车主被删除时,它的车也被删除(而不是相反)

 @Entity
    public class Owner
    {
        @OneToOne(cascade=CascadeType.ALL)
        private DrivingLicense license;

        @OneToMany(mappedBy="owner", cascade={CascadeType.PERSIST, CascadeType.MERGE})
        private Collection cars;

        ...
    }

    @Entity
    public class DrivingLicense
    {
        private String serialNumber;

        ...
    }

    @Entity
    public class Car
    {
        private String registrationNumber;

        @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
        private Owner owner;

        ...
    }

最佳答案

这里的陷阱是有两个 CascadeType 枚举。一个来自 javax.persistence,另一个来自 hibernate。一般来说,我更愿意使用持久性。

对于级联更新,请记住“更新”是一个 hibernate 术语,jpa 不知道这一点。 Jpa 不需要它,因为在 JPA 中的想法是您更新的字段将自动刷新到数据库。如果您对关系进行了任何更改,这些更改也会刷新。所以你不需要级联更新。

对于保存更新,这是一个 hibernate 快捷方式,可以根据对象的状态使用持久化或更新。由于您已经涵盖了持久化和更新(见上文),因此您不需要级联。

要级联删除,您可能想改用@OrphanRemoval。这将确保如果关系的父项被删除,子项也将消失(但反之则不然)。

    @OneToMany(mappedBy="owner", cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @OrphanRemoval
    private Collection cars;

关于java - 如何在hibernate注解中使用级联类型保存、删除、更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21230688/

相关文章:

java - 在 hibernate Multi-Tenancy 应用程序中启动时不查找数据源

Java/Android 如何将 Activity 调用到方法中?

java - 解决 Eclipse 2021-12 中插件对 org.eclipse.equinox.p2.iu 的依赖

JAVA - 是否有用于客户端-服务器交互/连接的日志/任何文件?

java - 如何在 hibernate 标准中使用 CURRENT_DATE 函数?

java - Hibernate 生成导致违反唯一约束的 @GeneeratedValue

java - 如何通过java编码跟踪其他应用程序的内存和CPU使用情况

java - GWT、Eclipse 插件如何重命名项目以及 .gwt.xml 文件?尝试这样做时出现错误

java - Hibernate - 删除期间表不存在

java - Hibernate 6 自定义 validator 消息如何从属性文件中显示?