2017-10-06 1 views
0

반복자를 사용하여 객체 목록을 탐색하고 있습니다.iterator.remove()는 데이터베이스에서 객체를 삭제합니다.

List<FormQuestion> questions = regMetadata.getFormQuestions(); 
    Iterator<FormQuestion> iter = questions.iterator(); 
    while (iter.hasNext()){ 
     FormQuestion question = iter.next(); 
     //if invalid question, delete from list 
     if(question.getModuleType().intValue() == -1) { 
      iter.remove(); 
     } 
    } 

iter.remove() 또한 DB에서 개체를 삭제하고 있습니다. 데이터베이스가 아닌이 목록 (질문)에서만 개체를 ​​삭제할 수있는 방법이 있습니까? 나는 최대 절전 모드 & MySQL을 사용하고있다.

+2

제공되는 작은 정보를 설명하기가 어렵지만, 만약 내가 OneToMany 관계에서 활성화 된 Cascading을 가지고 있고 엔티티가 분리되어 있지 않다는 것을 추측해야만한다면 말입니다. –

+0

일반적으로 저장하려는 경우가 아니면 영구 클래스의 내용을 변경해서는 안됩니다. 별도의 개체 (어쩌면 별도의 클래스)를 만든 다음 필요한 데이터를 복사하십시오. –

답변

1

나는 새로운 List로 작성, 질문을 필터링 할 것 :

List<FormQuestion> questionsAll = regMetadata.getFormQuestions(); 
List<FormQuestion> questions = new ArrayList<>(); 
for (FormQuestion question : questionsAll) { 
    // add to the list, unless invalid 
    if (question.getModuleType().intValue() != -1) { 
     questions.add(question) 
    } 
} 

또한, 나는에 대한-각 대신 Iterator의 루프를 사용합니다. 당신도 스트림을 다시 고칠 수 있습니다.

+0

나는 전에이 해결책을 시도했다; 그것은 나에게 다른 종류의 문제를 준다. StackTrace - {cascade = \ "all-delete-orphan \"인 컬렉션이 더 이상 소유 엔터티 인스턴스에 의해 참조되지 않았습니다. com.dyulok.dewa.model.register.RegistrationMetadata.formQuestions; 중첩 예외는 org.hibernate.HibernateException : cascade = \ "all-delete-orphan \"을 가진 콜렉션이 더 이상 소유 엔티티 인스턴스에 의해 참조되지 않음} 삭제 후 목록을 반환하고자합니다. 이 솔루션을 따르면 위의 예외가 throw됩니다. – balajiprasadb

+0

그런 다음 엔 아무것도 처리하기 전에 엔티티를 * 분리해야 할 수도 있습니다. 이것은'FormQuestion' -s에 대한'EntityManager.detach (object)'호출과 같은 것입니다. 그것은 최대 절전 모드 버전에도 달려 있습니다. –

0

귀하의 목록은 최대 절전 모드로 관리됩니다. 먼저 영속 컨텍스트에서 목록을 분리 한 다음 데이터베이스에서 제거하지 않고 목록에서 제거 할 수 있습니다. 나는 그 그림이 당신을 도울 수 있다고 생각합니다. http://www.objectdb.com/java/jpa/persistence/managed

관련 문제