Hibernate - Not able to delete child Objects from Parent Object
<p>I have a list of child objects mapped to a parent object in my application. Now, when the user deletes any child entries from the UI, I have to remove the child and parent object association and remove the child records from the database. Everything in my code seems to be fine, but the code neither removes the parent-child association nor deletes the child records from the database. Below is my code:</p>

<p><strong>Service code:</strong></p>

<pre><code>List&lt;ServerConfig&gt; existingConfig = serverMasterService.getServerConfigForServer(serverId);
            Set&lt;ServerConfig&gt; temp = new HashSet&lt;ServerConfig&gt;();

            for (ServerConfig sConfig : serverMstr.getServerConfigs()) {
                    for (ServerConfig eConfig : existingConfig){
                        if(sConfig.getAttributeId() == eConfig.getAttributeId()){
                            sConfig.setConfigId(eConfig.getConfigId());
                        }else{
                            temp.add(sConfig);
                        }
                    }
                    sConfig.setServer(serverMstr);
            }
            serverMstr.getServerConfigs().removeAll(temp);
        }
    this.serverMasterService.saveServerMasters(serverMstr);
</code></pre>

<p><strong>DAO code:</strong></p>

<pre><code>public void saveServerMasters(ServerMstr serverMstr) {
        hibernateTemplate.saveOrUpdate(serverMstr);
    }
</code></pre>

<p><strong>Parent HBM file:</strong></p>

<pre><code>&lt;set name="serverConfigs" inverse="true" cascade="all" lazy="false"&gt;
         &lt;key&gt;
            &lt;column name="serverId" not-null="true"/&gt;
         &lt;/key&gt;
         &lt;one-to-many class="com.serverApp.business.model.ServerConfig"/&gt;
   &lt;/set&gt; 
</code></pre>

<p><strong>Child HBM file:</strong></p>

<pre><code>&lt;many-to-one name="server" class="com.serverApp.business.model.ServerMstr" 
    cascade="all" lazy="false" foreign-key="FK_SERVERMSTR" &gt;
        &lt;column name="ServerId" not-null="true"/&gt;
    &lt;/many-to-one&gt;
</code></pre>

<p>Even if I delete all the child records by the below code, child objects are not getting deleted.</p>

<pre><code>serverMstr.getServerConfigs().removeAll(serverMstr.getServerConfigs());
this.serverMasterService.saveServerMasters(serverMstr);
</code></pre>

<p><strong>Edit</strong></p>

<p><strong>Parent Object class:</strong></p>

<pre><code>package com.serverApp.business.model;

import java.util.Set;

import javax.xml.bind.annotation.XmlRootElement;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@XmlRootElement(name = "ServerMaster")
@JsonIgnoreProperties({"environmentMstr"})  
public class ServerMstr      {

@JsonProperty("ID")
private Long id;

@JsonProperty("ServerConfigs")
private Set&lt;ServerConfig&gt; serverConfigs;

public Set&lt;ServerConfig&gt; getServerConfigs() {
    return serverConfigs;
}


public void setServerConfigs(Set&lt;ServerConfig&gt;  serverConfigs) {
    this.serverConfigs = serverConfigs;
}

public Long getId() {
    return id;
}


public void setId(Long id) {
    this.id = id;
}

@JsonProperty("Name")
private String name;

@JsonProperty("Notes")
private String notes;

@JsonProperty("Location")
private String location; 

@JsonProperty("SerialNo")
private String serialNo;

@JsonProperty("ServerFunction")
private String serverFunction; 

@JsonProperty("ServerType")
private String serverType; 

@JsonProperty("PrimAppl")
private String primAppl; 

@JsonProperty("Status")
private String status; 

@JsonProperty("IPAddress")
private String ipAddr; 

public String getLocation() {
    return location;
}


public void setLocation(String location) {
    this.location = location;
}


public String getSerialNo() {
    return serialNo;
}


public void setSerialNo(String serialNo) {
    this.serialNo = serialNo;
}


public String getServerFunction() {
    return serverFunction;
}


public void setServerFunction(String serverFunction) {
    this.serverFunction = serverFunction;
}


public String getServerType() {
    return serverType;
}


public void setServerType(String serverType) {
    this.serverType = serverType;
}


public String getPrimAppl() {
    return primAppl;
}


public void setPrimAppl(String primAppl) {
    this.primAppl = primAppl;
}


public String getStatus() {
    return status;
}


public void setStatus(String status) {
    this.status = status;
}


public String getIpAddr() {
    return ipAddr;
}


public void setIpAddr(String ipAddr) {
    this.ipAddr = ipAddr;
}


public String getNotes() {
    return notes;
}

public void setNotes(String notes) {
    this.notes = notes;
}

public ServerMstr(){
}

public ServerMstr(   String name, String notes ){
    this.name = name;
    this.notes=notes;
} 

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


@Override
public String toString() {
    return "ServerMstr [id=" + id + ", serverConfigs=" + serverConfigs
            + ", name=" + name + ", notes=" + notes + ", location="
            + location + ", serialNo=" + serialNo + ", serverFunction="
            + serverFunction + ", serverType=" + serverType + ", primAppl="
            + primAppl + ", status=" + status + ", ipAddr=" + ipAddr + "]";
}

}
</code></pre>

<p><strong>Child Object:</strong></p>

<pre><code>package com.serverApp.business.model;


import javax.xml.bind.annotation.XmlRootElement;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;


@XmlRootElement(name = "ServerConfig")
@JsonIgnoreProperties({"configId", "server"})
public class ServerConfig    {

@JsonIgnore
private ServerMstr server; 

private Long configId; 



@Override
public String toString() {
    return "ServerConfig [server=" + server.getName() + ", configId=" + configId
            + ", attributeId=" + attributeId + ", value=" + value
            + ", serverId=" + serverId + "]";
}

@JsonProperty("AttributeId")
private Long attributeId;

@JsonProperty("Value")
private String value;

@JsonProperty("ServerId")
private Long serverId; 


public Long getConfigId() {
    return configId;
}

public void setConfigId(Long configId) {
    this.configId = configId;
}

public Long getServerId() {
    return serverId;
}

public void setServerId(Long serverId) {
    this.serverId = serverId;
}

public Long getAttributeId() {
    return attributeId;
}

public void setAttributeId(Long attributeId) {
    this.attributeId = attributeId;
}


public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

public ServerConfig() {
}

public ServerConfig( Long serverId, Long attributeId, String value )
{
    this.serverId = serverId;
    this.attributeId = attributeId;
    this.value=value;
 }

public void setServer(ServerMstr server) {
    this.server = server;
}

public ServerMstr getServer() {
    return server;
}

}
</code></pre>

<p><strong>DAO code:</strong></p>

<pre><code>package com.serverApp.business.dao;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.serverApp.business.model.ServerConfig;
import com.serverApp.business.model.ServerMstr;

@Repository ("serverMstrDao")
public class ServerMstrDaoImpl extends AbstractDAOImpl implements  ServerMstrDao{

private static final Logger logger = Logger.getLogger(ServerMstrDaoImpl.class);

/*
 * This Method will be used to retrieve the list of ServerMstr Class Details from the DB
 * (non-Javadoc)
 * @see com.serverApp.business.dao.ServerMstrDao#listServerMstrs()
 */
@Override
@SuppressWarnings({"unchecked" })
public List&lt;ServerMstr&gt; listServerMstrs() {
    if (logger.isDebugEnabled()) {
        logger.debug("Inside listServerMstrs() ");
    }
    return (List&lt;ServerMstr&gt;)hibernateTemplate.find("from ServerMstr");
}

/*
 * This Method will be used to save new server to database
 *  (non-Javadoc)
 * @see com.serverApp.business.dao.ServerMstrDao#saveServerMasters(com.serverApp.business.model.ServerMstr)
 */
@Override
 @Transactional  
    public void saveServerMasters(ServerMstr serverMstr) {
    if (logger.isDebugEnabled()) {
        logger.debug("Inside saveServerMasters() ");
    }

        System.out.println("DAO Print: "+serverMstr.toString());
        hibernateTemplate.saveOrUpdate(serverMstr);
    }

/*
 * This Method will be used to retrieve the ServerMstr Class Details from the DB for the given name
 * (non-Javadoc)
 * @see com.serverApp.business.dao.ServerMstrDao#getServerByName()
 */
@SuppressWarnings("unchecked")
@Override
public ServerMstr getServerByName(String name) {
    if (logger.isDebugEnabled()) {
        logger.debug("fetching server from database with name : " + name );
    }
    DetachedCriteria criteria = DetachedCriteria.forClass(ServerMstr.class);
    criteria.add(Restrictions.eq("name", name));
    List&lt;ServerMstr&gt; serverMstr = hibernateTemplate.findByCriteria(criteria); 
    if(serverMstr.size() != 1)
    {
        logger.error("Multiple or 0 row returned for selection Server name: " + name );
        return null;
    }
    return (ServerMstr)serverMstr.get(0);
}

/*
 * This Method will be used to retrieve the ServerConfig Class List from the DB for the given server id
 * (non-Javadoc)
 * @see com.serverApp.business.dao.ServerMstrDao#getServerConfigForServer()
 */
@SuppressWarnings("unchecked")
@Override
public List&lt;ServerConfig&gt; getServerConfigForServer(Long serverId) {
    if (logger.isDebugEnabled()) {
        logger.debug("fetching ServerConfig list from database for server with id : " + serverId );
    }

    return hibernateTemplate.find("from ServerConfig where serverId = ?",serverId);
}
}
</code></pre>

<p>Any help/suggestion is really appreciated</p>