2017-04-19 56 views
0

在Hibernate中,它可能沒有關於級聯集合映射的問題。但遇到.l在Hibernate 4.2中使用Annotation。Hibernate集合映射questions.Cannot刪除或更新父行:外鍵約束失敗

這是我的實體類:

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",[email protected](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; 
    } 

} 

但是當升嘗試在partymember刪除數據,它的錯誤。

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

但是當我刪除黨員中的數據時,爲什麼它不刪除培養中的數據(集合映射)?這太奇怪了! 謝謝!

+0

您沒有設置收集的CASCADE財產上的實體。 –

+0

您需要查看「級聯」。 –

回答

0

你的子表有外鍵,你還沒有啓用級聯刪除。

因此,當您試圖刪除父行時,子行不會被刪除,這就是爲什麼您面臨MySQLIntegrityConstraintViolationException。

您應該啓用級聯刪除以刪除父行上的所有相關子行。

的語法會像下面

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