2012-02-28 4 views
0

다음 링크에서 왔습니다 : https://stackoverflow.com/a/9372684/574460. 나는 이진 데이터를 데이터베이스에 저장할 때 그 코드를 일찍 놓은 링크에 저장했다. 더 빠른 참조를 위해 다시 입력하겠습니다.CRUD 모듈을 사용한 특별 업데이트

@Column(columnDefinition="BYTEA NOT NULL", nullable=false) @Password 
public byte[] password; 

@Required @Password @Transient 
public String hash; 

@ManyToOne 
@Required 
public Departamento departamento; 

@PrePersist 
@PreUpdate 
public void hashPassword() throws Exception { 
    this.password = Crypto.passwordHash(this.hash, Crypto.HashType.SHA512).getBytes(); 
    System.out.println(this.password); 
} 

이제 문제는 암호를 업데이트 할 수 없다는 것입니다. 빈 템플릿 에서처럼 데이터를 가져 오기 위해 쇼 템플릿을 변경했지만 단순히 데이터를 업데이트 할 수 없습니다. @PreUpdate 주석 추가 기능이 제대로 작동하지 않는 것 같습니다.

어떻게해야합니까? 모든 조언을 주시면 감사하겠습니다.

UPDATE :

@grahamrb이 sugested, 내가 데이터 만 저장하고 업데이트 할 수있는 set 메소드를 오버라이드 (override) 할 필요가 보인다. 감사합니다 @ grahamrb

+1

() _ 메서드를 사용하고 거기에 해시 알고리즘이 있습니까? – grahamrb

+0

어떻게해야합니까'code' public void setHash (String hash) { this.hash = Crypto.passwordHash (hash) .getBytes(); }'code'로 충분합니까? 나는 getter도해야합니까? – JuanToroMarty

답변

0

문제는 일부 개체 필드 값이 변경된 경우에만 @PreUpdate 주석과 관련된 방법입니다. 그러나 @Transient 필드를 업데이트하려고하면 변경 사항을 감지 할 수 없으며 메소드가 호출되지 않습니다.

나는 비슷한 문제와 내가 만날 수있는 최선의 해결책을 발견했다. 변경 사항에 대해 최대 절전 모드로 전환하기 위해 대리 값이있는 데이터베이스 필드에 저장한다. 예를 들면 :

모델 컨텍스트 :

public Long updatingHackHash; 

public void renewUpdatingHackHash() { 
    this.updatingHackHash = System.currentTimeMillis(); 
} 

컨트롤러 컨텍스트 : 당신은 "해시"개체를 제거하고 대신 _public 무효 SETPASSWORD를 오버라이드 (override)되지 않는 이유는

public static void save(MyModel myModel) { 

    // ... 

    myModel.renewUpdatingHackHash(); 
    myModel.save(); 

    // ... 
} 
관련 문제