简体   繁体   中英

Hibernate collections mapping questions.Cannot delete or update a parent row: a foreign key constraint fails

In Hibernate, it may have no the problem about cascade in collections mapping.but l encountered.l use Annotation in Hibernate 4.2.

this is my entity class:

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;

import com.partysys.partymanage.deus.entity.Deus;
import com.partysys.partymanage.period.entity.Period;
import com.partysys.sysmanage.branch.entity.Branch;


@Entity
@Table(name = "partymember")

public class Partymember implements java.io.Serializable {

    private String id;

    private String password;

    private String name;

List<String> cultivate;
    public Partymember() {
    }

    public Partymember(String id) {
        super();
        this.id = id;
    }



    @GenericGenerator(name = "generator", strategy = "uuid.hex")
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name = "partymember_id", unique = true, nullable = false, length = 32)
    public String getId() {
        return this.id;
    }


    public void setId(String id) {
        this.id = id;
    }
    @Column(name="password", length=25)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }




    @Column(name = "name", length = 30, nullable=false)

    public String getName() {
        return this.name;
    }

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




 @ElementCollection(targetClass=String.class, fetch=FetchType.EAGER)
 @CollectionTable(name="cultivate_person",joinColumns=@JoinColumn(name="partymember_id",nullable=false))
        @Column(name = "cultivate", length = 20)

 @OrderColumn(name="t_order")
    public List<String> getCultivate() {
        return this.cultivate;
    }

    public void setCultivate(List<String> cultivate) {
        this.cultivate = cultivate;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Partymember other = (Partymember) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

but when l try to delete data in partymember, it mistakes.

BaseDaoImpl.java:

public void delete(Serializable id)
    {
        getSessionFactory().getCurrentSession()
            .createQuery("delete " + clazz.getSimpleName()
                + " en where en.id = ?0")
            .setParameter("0" , id)
            .executeUpdate();
    }

PartymemberAction.java:

partymemberService.delete(partymember.getId());

PartymemberServiceImpl.java:

@Override
    public void delete(Serializable id) {
        partymemberDao.deleteUserRoleByUserId(id);
        partymemberDao.delete(id);
    }

the stack trace:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`partysys`.`cultivate_person`, CONSTRAINT `FK_sllcrigxee4qhp11422d59mop` FOREIGN KEY (`partymember_id`) REFERENCES `partymember` (`partymember_id`))

but when l delete the data in Partymember, why it doesn't delete the data in cultivate(collections mapping) ? it is so strange! Thank you!

Your child table have foreign key, you have not enabled cascade delete.

So when you are trying to delete parent row, child rows are not going to deleted, that's why you are facing MySQLIntegrityConstraintViolationException.

You should enable cascade delete to delete all dependent child rows on deletion of parent row.

The syntax will be something like below

@OneToMany(mappedBy="parent_table", cascade={CascadeType.PERSIST, CascadeType.REMOVE}) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM