2017-08-23 9 views
1

私はSpringとMySqlデータベースを使用しています。私は1対多の関係として投稿テーブルに接続されているユーザーテーブルからユーザーを削除しようとしています。解決方法親行を削除または更新できません:Springで外部キー制約が失敗する

User.java

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.PERSIST }) 
    private List<Post> posts; 

     //getters and setters 

    } 

Post.java

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn (name="profesor_id", referencedColumnName="id", unique=true) 
private User user; 

    //getters and setters 

Profesor.java

@Entity 
public class Profesor extends User { 

    private String jobTitle; 

    public String getJobTitle() { 
     return jobTitle; 
    } 

    public void setJobTitle(String jobTitle) { 
     this.jobTitle = jobTitle; 
    } 
} 

Controller.java

@RequestMapping(value="profesorList/{id}/deleteProfesor", method=RequestMethod.GET) 
    public ModelAndView deleteProfesor(@PathVariable long id){ 
     profesorRepository.delete(id); 
     return new ModelAndView("redirect:/profesorList"); 
    } 

index.htmlを

<td><a th:href="@{'/profesorList/{id}/deleteProfesor'(id=${profesor.id})}"</a></td> 

UserRepository.java

@Repository 
public interface UserRepository extends CrudRepository<User, Long>, UserDetailsService { 

    public User findUserByUsername(String username); 

} 

ProfesorRepository.java

@Repository 
public interface ProfesorRepository extends JpaRepository<Profesor, Long>{ 

} 

私は1つのテーブル継承を使用しています。だから私はユーザーと同じテーブルのユーザーと教授を持っています。

しかし、私はそれを実行しようとしたとき、私はこのエラーを取得しています:

Cannot delete or update a parent row: a foreign key constraint fails (`data`.`post`, CONSTRAINT `FK5q2menkhkd7av4xfslbgbuq3y` FOREIGN KEY (`profesor_id`) REFERENCES `users` (`id`)) 

私はそれを解決できますか?

答えて

1

エンティティを削除する予定がある場合、削除する必要がある場合は削除をカスケードする必要があります。そうすれば、投稿を削除する場合は、投稿を削除する前に、そのユーザーの投稿リストからこの投稿を削除してください。

以下のように、ユーザーモデルで「CascadeType.REMOVE」を追加してください。

ユーザーテーブルエントリを削除するには、まずこのレコードの子テーブル '投稿'エントリを削除する必要があります。

@RequestMapping(value="profesorList/{id}/deleteProfesor", method=RequestMethod.GET) 
public ModelAndView deleteProfesor(@PathVariable long id){ 
    Profesor profesor = profesorRepository.findOne(id); 
    if(Objects.nonNull(profesor)){ 
     List<Post> posts = profesor.getPosts(); 
     for (Iterator<Post> iterator = posts.iterator(); iterator.hasNext();) { 
      Post post = iterator.next(); 
      post.setUser(null) 
      iterator.remove(); //remove the child first 
     } 
     profesorRepository.delete(profesor); 
    } 


    return new ModelAndView("redirect:/profesorList"); 
} 
関連する問題