Search code examples
hibernateannotationshibernate-mappinghibernate-annotationsall-delete-orphan

Annotation for all-delete-orphan in hibernate 4.1.4


I'm new to this hibernate annotation. I want to convert this xml mapping into annotations:

<map name="Text" table="JAV_TEXT" inverse="true" cascade="all-delete-orphan">
    <key column="FK_GUID"/>
    <map-key column="TEXT_GUID" type="string"/>
    <one-to-many class="com.TextPO"/>
</map>

This is what I have done:

@OneToMany(fetch = FetchType.LAZY, targetEntity=com.TextPO.class)
@Cascade({CascadeType.DELETE_ORPHAN})
@JoinColumn(name="FK_GUID")
@MapKey(name="TEXT_GUID")
private Map<String, PersistentObject> text = new HashMap<String, PersistentObject>();

But CascadeType.DELETE_ORPHAN is deprecated, so how do I represent all-delete-orphan through annotations? I'm using hibernate 4.1.4.


Solution

  • Yes in Hibernate 4.1.4 version delete-orphan is deprecated, now in Hibernate and JPA 2.0 you can use orphanRemoval instead:

    @OneToMany(orphanRemoval = true)
    

    Your mapping should be like this:

    @OneToMany(fetch = FetchType.LAZY, targetEntity=com.TextPO.class, orphanRemoval = true)
    @JoinColumn(name="FK_GUID")
    @MapKey(name="TEXT_GUID")
    private Map<String, PersistentObject> text = new HashMap<String, PersistentObject>();
    

    And also remove the @Cascade annotation you can use it as an attribute of the @OneToMany annotation like this:

    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, targetEntity=com.TextPO.class, orphanRemoval = true)
    

    Take a look at this Example for further reading.

    EDIT:

    To give the inverse="true" property in your mapping you just need to specify the mappedBy attribute in your @OneToMany annotation to refer the owning part of the relation, like this:

    @OneToMany(fetch = FetchType.LAZY, targetEntity=com.TextPO.class, orphanRemoval = true, mappedBy= "theOneSide")
    

    Here the theOneSide is used as an example you just need to specify the field name used in the other side class of the mapping, for example:

    @ManyToOne
    private MyClass theOneSide;
    

    Take a look at inverse=true in JPA annotations for further information.