2014-01-20 39 views
3

任何人都可以解释我hibernate注释如何使用不同类型的级联,如delete,upadte,save-update?如何在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; 

     ... 
    } 
+2

可能知道你们为什么被拒绝投票给我的候选人吗?我已经搜索很多在谷歌找到这个答案,但我知道如何使用 – user3214269

+0

我读了一个,所有的XML映射不在注释中,如果你给我的链接那将是伟大的。 – user3214269

+0

这一个很好:http://www.datanucleus.org/products/datanucleus/jpa/orm/cascading.html – kostja

回答

2

这里的缺陷是有两个的CascadeType枚举。一个是javax.persistence,另一个来自休眠。一般来说,我宁愿使用持久性。

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

对于保存更新,这是一个休眠快捷方式,根据对象的状态使用持久或更新。既然你已经覆盖了持久化和更新(见上面),你不需要在这个层面上进行级联。

要级联删除,您可能需要使用@OrphanRemoval代替。这将确保如果关系的父母被移除,孩子也不见了(但不是相反)。

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

mappedBy =“所有者”,你可以只是简单介绍一下。 – user3214269

+0

@ user3214269这是来自您自己的代码...请参阅http://stackoverflow.com/questions/11938253/jpa-joincolumn-vs-mappedby –

相关问题