2009-12-14 2 views
2

최대 절전 모드로 해시 맵에서 항목을 삭제하려고합니다. 여기최대 절전 모드에서 해시 맵에서 항목을 제거하려면 어떻게해야합니까?

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
@OneToMany(mappedBy = "game", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@Where(clause = "charactType='charact'") 
@MapKey(name = "shortcut") 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
public Map<String, Characteristic> getCharacteristics() 
{ 
    return characteristics; 
} 

public void setCharacteristics(Map<String, Characteristic> characteristics) 
{ 
    this.characteristics = characteristics; 
} 

와 같은 객체에 내 제거 기능입니다 : 데이터베이스에서 항목을 삭제하지 않는 removeCharacteristic를 사용

@Transactional 
public void removeCharacteristic(Characteristic charact) 
{ 
    // getCharacteristics().size(); 

    getCharacteristics().remove(charact.getShortcut()); 
} 

다음은 컬렉션 내 설정이다. 목록의 크기를 얻기 위해 줄의 주석 처리를 제거하면 (컬렉션의로드가 강제 됨) 레코드가 잘 삭제됩니다.

무엇이 문제입니까? 전체 컬렉션의로드를 강요하지 않으면 어떻게 할 수 있습니까?

EDIT : 지도를 List로 대체하고 매력적으로 실행됩니다 (이전에 size() 함수로로드하지 않고) ... 이것은 매우 이상합니다 ... 그래서 내 문제는 목록,하지만 왜 실행되지 않는지 궁금 해서요?

+0

귀하의 거래는 제대로 최선을 다하고 있습니다 (세션 플러시)? –

+0

플러시되지 않은 경우 주석 처리되지 않은 줄은 아무 것도하지 않기 때문에 나는 그렇다고 생각합니다. –

+0

트랜잭션 관리자에 대한 로깅을 활성화하고 최대 절전 모드 구성이 올바른지 확인할 수 있습니까? –

답변

0

이이 지금 최신 버전에서 해결, 최대 절전 모드 버그이었다

0

명시 적으로 콜렉션을 설정하십시오. 예 :

c = getCharacteristics(); 
c.remove(...); 
setCharacteristics(c); 
+0

아니요, 아무것도 수행하지 않습니다. –

0

당신은 당신이 대신 목록을 사용할 때, 일이 잘못 .remove지도의() 함수를 사용하는 것이 가능하다고 말했다 때문에? 지도

.remove() 함수는 제거 할 개체, 하지 실제 객체의 KEY를합니다.

myMap.remove(MyObject.getKey()); //Or however you would get the key 

목록 의 .remove() 함수는 제거 할 개체 소요;

myList.remove(MyObject); 

편집 : 당신이 한 줄이 제대로 작동하는지의 주석, 그렇다면이 가장 가능성이 적용되지 않는다고 말했다 것을 알 수있다.

+0

네, 맞습니다. 그러나 객체를 제거하기 위해 좋은 키를 효과적으로 사용합니다;) –

관련 문제