簡體   English   中英

Hibernate集合映射問題。無法刪除或更新父行:外鍵約束失敗

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

在Hibernate中,可能沒有關於集合映射中級聯的問題。但是遇到了。在Hibernate 4.2中使用了Annotation。

這是我的實體類:

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

}

但是當我嘗試刪除黨員中的數據時,會出錯。

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);
    }

堆棧跟蹤:

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`))

但是當我刪除Partymember中的數據時,為什么不刪除培養(集合映射)中的數據呢? 太奇怪了! 謝謝!

您的子表具有外鍵,尚未啟用級聯刪除。

因此,當您嘗試刪除父行時,子行不會被刪除,這就是為什么您面臨MySQLIntegrityConstraintViolationException的原因。

您應該啟用級聯刪除功能,以在刪除父行時刪除所有相關的子行。

語法如下所示

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM