2017-01-04 9 views
2

내가 저자와 책 사이의 많은 관계로 하나를 한 번 저자는 많은 책을 가지고 ..부모를 삭제하는 동안 Grails가 하위를 삭제하지 못하게하는 방법은 무엇입니까?

내가 가진이

Author.groovy

class Author { 

    String authorName; 
    String authorAddress; 
    String authorCNIC; 

    static hasMany = [books:Book] 

    static constraints = { 

     books(nullable: true) 
    } 
} 

Book.groovy

같은 도메인 클래스
class Book { 

    String bookName; 
    String Isbn; 

    static belongsTo = [author:Author] 

    static constraints = { 

     author(nullable: true) 
    } 



} 

이 함수를 호출 할 때

def deleteauthor() 
    { 
     def id=params.id 
     Author author = Author.findById(id); 
     author.delete(flush: true) 
     render "Author Deleted" 
    } 

저자 및 모든 하위 책을 삭제합니다.이 동작을 원하지 않습니다. 작성자와 책을 삭제할 수 없으며 메시지를 표시 할 수 없기 때문에 저자, 먼저 책을 삭제할 수 없습니다. 방법을 알려주십시오. 이 작업을 수행 ? 당신의 저자 모델에서

+0

작성자를 찾아서 책 ​​수가 0보다 작 으면 삭제하지 말고 오류 메시지를 발행하십시오. – railsdog

+0

작가 책 수를 확인하는 방법은 무엇입니까? – Ahmad

+0

'저자 작성자 = .get (id) if (author.books? .size()> 0) {렌더링 실패} return} author.delete (flush : true) render "작성자 삭제됨"은 방법입니다. 하지만 어쩌면 당신은'캐스케이드'를 볼 필요가있다 http://docs.grails.org/latest/ref/Database%20Mapping/cascade.html – Vahid

답변

1

당신이 제약 cascade: 'none'을 추가해야합니다 :

class Author { 

    String authorName; 
    String authorAddress; 
    String authorCNIC; 

    static hasMany = [books:Book] 

    static mapping = { 
     cascade: 'none' 
    } 
} 

이 삭제 책을 방해하는 그냥 null로 author_id을 설정합니다.

UPDATE :

cascade 'none'을 설정하면 연쇄가 저장하지 않도록 할 것 같다. 추가 된 모든 책 인스턴스에 save을 수동으로 호출하는 옵션이 있습니다. 내가 생각

다른 것은 저자 : 제한 조건 위반 예외가 삭제 될 때 최대 절전 모드에 on delete set null를 설정하는 방법이 없기 때문에

당신은 다음 save-update에만 작업에 폭포를 설정할 수 있지만. beforeDelete에서 수동으로 처리 할 수 ​​있습니다.

class Author { 

    String name; 

    static hasMany = [books:Book] 

    static mapping = { 
     books cascade: 'save-update' 
    } 

    def beforeDelete() { 
     Book.withNewSession { 
      Book.findAllByAuthor(this).each { 
       it.author = null 
       it.save(flush: true) 
      } 
     } 
    } 
} 

매우 좋지는 않지만 효과가있는 것처럼 보입니다.

+0

나는 그것을 체크했으나 여전히 그것도 자식을 삭제하고 또한 부모 .. 그것은 작동하지 않는다 – Ahmad

+0

이 캐스 캐 이드 : '없음'은 매핑 블록에 있어야합니다. – Abs

+0

@Abs는 발언에 감사드립니다. –

1

내 평판으로 인해 나는 의견을 남길 수는 없지만 대답 할 수 있습니다. 작성자를 삭제할 때 책을 삭제하는 이유는 작성자 도메인에서 "belongsTo"를 설정했기 때문입니다. 이것은 관계를 "소유"하고 계단식을 처리하는 방법을 지시합니다.

다른 RELATIO와 마찬가지로

계단식 :

특히 :

다음 볼 수 있습니다 nships, 컬렉션 마스터 링은 계단식 동작을 마스터하는 것을 의미합니다. 주의해야 할 첫 번째 점은 belongsTo가 지정되지 않은 경우에도 부모가 항상 자식으로 캐스케이드된다는 것입니다. 그렇다면 belongsTo를 사용하는 것이 무엇입니까? 예.

우리가 저자와 그의 책을 추가 한 후 우리는 콘솔에이 코드를 실행하면 어떻게되는지 생각해 즉

class Book { 
    String title 

    static constraints = { 
    title(blank: false) 
    } 

} 

class Author { 
    String name 
    Location location 

    static hasMany = [ books: Book ] 
} 

def a = Author.get(1) 
a.delete(flush: true) 

println Author.list()*.name 
println Book.list()*.title 
The output looks like this: 


[] 
[Empire, Colossus] 

은, 저자가 삭제 된, 그러나 책은하지 않았습니다. 그것이 belongsTo가 나오는 곳입니다. 그것은 삭제가 캐스 캐 이드되고 세이브되는 것을 보장합니다. 단순히 static belongsTo = Book에 줄을 추가하면 위의 코드는 작성자와 책에 대한 빈 목록을 인쇄합니다. 간단 하죠? 이 경우 네,하지만 진짜 재미는 단지 시작에 불과합니다.

AuthorTo를 삭제하면 작성자를 삭제할 때 계단식 삭제가 중지되지만 책은 삭제됩니다. 관련 엔티티가 있지만 지금은 방법을 기억할 수없는 경우 삭제시 오류가 발생할 수있는 방법이 있다고 생각합니다. 적어도 캐스케이드 삭제에 대해 당신을 보호 할 것입니다.

'저자 작성자'를 책에 추가하여 관계를 유지할 수 있다고 생각합니다.