2017-08-23 1 views
1

Ich verwende Spring und MySql-Datenbank. Ich versuche, Benutzer von der Benutzertabelle zu löschen, die mit Posttabelle als eine zu viele Beziehung verbunden ist.So lösen Sie Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt in Spring fehl.

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>{ 

} 

Ich verwende eine Tabelle Vererbung. So habe ich Benutzer und profesor in der gleichen Tabelle wie Benutzer.

Aber wenn ich versuche, es auszuführen ich diese Störung erhalte:

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

Wie kann ich es lösen?

Antwort

1

Sie haben eine bidirektionale Beziehung, wenn Sie also eine Entität entfernen möchten, müssen Sie die Beziehung entfernen (andernfalls müssen Sie Ihre Löschung kaskadieren). Wenn Sie also eine Veröffentlichung entfernen möchten, müssen Sie den Benutzer und Entfernen Sie diesen Beitrag aus der Beitragsliste in diesem Benutzer, bevor Sie den Beitrag löschen

Fügen Sie "CascadeType.REMOVE" in das Benutzermodell wie unten angegeben hinzu.

Um den Benutzertabelleneintrag zu löschen, müssen Sie zunächst den Eintrag 'Post' der untergeordneten Tabelle für diesen Datensatz löschen.

@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"); 
} 
Verwandte Themen