2014-11-05 5 views
3

다른 테이블에 FK가 포함 된 테이블 계정이 있습니다.

옵션 1 : 내가) (저장 호출 할 때마다하는 다른 테이블의 ID, 다음 업데이트 자체를 검색하기 위해 만든 조인Spring Data JPA를 사용하여 엔티티를 업데이트하는 올바른 방법은 무엇입니까?

@Override 
@Transactional(readOnly = false) 
public Account changePassword(Account existingAccount, String newPassword){ 
    existingAccount.setPassword(newPassword); 
    return accountDAO.save(existingAccount); 
} 

이 방법.
모든 필드는 암호 변경만으로도 여기에서 업데이트됩니다.

편집 :는 나는 내가 매개 변수 (existingAccount)로 개체를 전달 해요 때문에 이루어지고 조인 알아 냈어. 대신 changePassword 메서드에서 찾으면 잘 동작합니다 (조인 없음). 문제는, 유효성 검사를 위해이 엔티티가 컨트롤러에 필요하므로 같은 데이터베이스 호출을 2 번 호출하는 것이 무의미하다는 것입니다.

옵션 2 :

@Modifying 
@Query("UPDATE Account SET password=(:pass) WHERE username=(:username)") 
public void changePassword(@Param("username")String username, @Param("pass")String pass); 

이 방법은 @query 내에서만 정의 업데이트가 실행됩니다.

성능면에서는 옵션 2가 좋지만 옵션 1에서는 jpa와 비슷한 느낌이 듭니다. 어떤 제안도 감사합니다.

+0

당신은 추가하는 것도 정말이없는 Account''의 코드와'AccountRepository' 인터페이스 –

+0

를 추가해야합니다. 옵션 1은 서비스 계층 코드이며 저장소에는 아무 것도없고 옵션 2는 저장소 인터페이스 코드입니다. 서비스 계층은 단지 그것을 호출하고 그 것이다. – Sikor

답변

2

두 가지 모두 괜찮습니다.

동적 업데이트 (옵션 - 디폴트는 false) : 첫 번째 방법을 사용하지만 비밀번호 외에 필드를 업데이트하지 않도록하려면 당신이 주석 @DynamicUpdate(value=true)configure dynamic-update 수 UPDATE SQL을 수행 할 수 있습니다 실행시에 생성되도록 지정 값이 변경된 열만 포함하십시오.

이 경우 select-before-update 또는 optimistic 잠금을 사용해야합니다. select-before-update는 모든 필드를 업데이트하는 것보다 성능이 좋지 않을 수 있습니다.

분명히 this is implementation-specific and not part of JPA.

+0

atm 및 @ org.hibernate.annotations.Entity가 더 이상 사용되지 않지만 @DynamicUpdate (value = true)가 대신 작동합니다. 그것은 당신이 말한대로 작동하지만 유일한 문제는 첫 번째 옵션은 여전히 ​​업데이트하기 전에 조인을 실행합니다 (tho는 지금 1 개의 필드 만 업데이트 함). – Sikor

+0

@Sikor : 흥미 롭습니다. 어쩌면 합류 한 것을 게으르게 연결시킬 수 있을까요? –

+0

@OneToOne (가져 오기 = FetchType.LAZY, 캐스케이드 = CascadeType.ALL) @JoinColumn (이름 = "pilot_id"), 그것은 게으른입니다 : D – Sikor

관련 문제