如何在hibernate注释中使用级联类型保存,删除,更新

时间:2014-01-20 09:46:28

标签: java hibernate

任何人都可以解释一下hibernate注释如何使用不同类型的级联,如delete,upadte,save-update?

如何确保删除所有者时,其车辆也会被删除(但不是相反)

 @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;

        ...
    }

1 个答案:

答案 0 :(得分:2)

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

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

对于save-update,这是一个使用persist或update的休眠快捷方式,具体取决于对象的状态。由于您已经覆盖了持久性和更新(见上文),因此您不需要级联。

要级联删除,您可能希望使用@OrphanRemoval。这将确保如果关系的父级被删除,孩子也会消失(但不是相反)。

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