2017-04-19 3 views
0

Hibernateでは、コレクションマッピングのカスケードに関する問題が発生しない可能性があります。Hibernateコレクションマッピングの質問。親行を削除または更新できません。外部キー制約が失敗します。

これは私のエンティティクラスである:

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

} 

しかしときlは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`)) 

しかし、Partymemberのデータを削除すると、なぜ耕起(コレクションマッピング)のデータが削除されないのですか?それはとても奇妙です! ありがとうございました!

+0

以下のようになります。 –

+0

あなたは 'カスケード'を調べる必要があります。 –

答えて

0

子テーブルに外部キーがあります。カスケード削除を有効にしていません。

親行を削除しようとすると、子行が削除されないため、MySQLIntegrityConstraintViolationExceptionが発生します。

親行の削除時に、すべての従属子行を削除するには、カスケード削除を有効にする必要があります。

構文はあなたがエンティティにコレクションのCASCADEプロパティを設定しなかった

@OneToMany(mappedBy="parent_table", cascade={CascadeType.PERSIST, CascadeType.REMOVE}) 
関連する問題