2017-01-19 4 views
1

질문이 있습니다. 암호가있는 User 엔티티가 있습니다. User 객체를 반환하는 함수가 있습니다..find로 비밀번호를 표시하지 않는 방법 JPA

public User findUser(long id) { 
    return em.find(User.class, id); 
} 

이 코드는 암호가 모두 포함 된 사용자를 반환합니다. 반환 된 엔티티에서 비밀번호를 제거하려면 어떻게해야합니까? 왜냐하면 나는 사용자 객체로 Json 응답을 되돌려 보내야하기 때문이다. 나는 ... 당신의 조언을

public User findUser(long id) { 
    User user = new User(); 
    find = em.find(User.class, id); 
    user.setUsername(find.getUsername()); 
    user.setMail(find.getMail()); 

    return user; 
} 

덕분에 그 같은 생각하지만 추한했습니다.

+0

거래를 일반 암호를 저장 싶지 않다. 가정하면 잭슨은 @JsonProperty (access = JsonProperty.Access.WRITE_ONLY) 또는 @JsonIgnore 같은 속성을 필요에 따라 사용합니다. –

답변

1

제가 올바르게 이해하면 findUser 메소드는 트랜잭션 중 하나입니다. 또한 그 안의 암호를 지우고 싶지만 PersistenceContext가 암호를 알고 데이터베이스에 변경 사항을 플러시하여 암호를 비우지 않게하려고합니다. 당신은 당신이 원하는 변화를 만들 수있는 PersistenceContext의 분리에

find = em.find(User.class, id); 
em.detach(find); 
find.setPassword(null); 

return find; 

감사하고이 데이터베이스에 지속되지 않습니다 :이 경우

후 다음을 수행합니다. 규격 :

공극 분리 (java.lang.Object 상위 엔티티)

은 분리 될 수있는 관리 엔티티를 일으키는 영속 컨텍스트에서 지정된 엔티티를 제거한다. 엔티티 (엔티티 제거 포함)가있는 경우 플러시되지 않은 변경 사항은 데이터베이스에 동기화 된 이 아닙니다. 이전에 분리 된 엔티티를 참조한 엔티티는 계속이 엔티티를 참조합니다.

시험해보세요.

+0

고마워, 그것은 작동 :). –

0

이런 종류의 시나리오에서 제안 사항으로, 자격 증명을 위해 별도의 도메인을 사용합니다. 예 :

Class Credential { 
    password; 
    username; 
    user; 
} 

사용자도 별도로 정의하십시오.

class User { 
} 

그런 다음 자격 증명 도메인에서 명명 된 쿼리에 jpa를 사용하여 사용자를 로그인하십시오. 물론

SELECT c.user FROM Credential c WHERE c.username = :username AND password = :password; 

는 일반적으로 암호 해시되고 당신은 아마 JSON 수준에서 DB에와