2012-07-19 1 views
2

다음과 같이 'UserRoleHolder'라는 모델이 있습니다. JPA 복합 PK가 재생 프레임 워크에서 'finder'와 작동하지 않습니다.

@Entity 
public class UserRoleHolder extends Model implements RoleHolder { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    public UserRoleHolderPK userRoleHolderPK; 
    public List<UserPermission> permissions; 
    public List<UserRole> roles; 
    .... 

나는 복합 PK가 UserRoleHolderPK라고하고 아래와 같이 두 개의 외부 키를 포함했다.

@Embeddable 
public class UserRoleHolderPK { 
    @Basic 
    public Long userId; 
    @Basic 
    public Long projectId; 

    public UserRoleHolderPK(Long userId, Long projectId) { 
     this.userId = userId; 
     this.projectId = projectId; 
    } 

    public boolean equals(Object object) { 
     if (object instanceof UserRoleHolderPK) { 
      UserRoleHolderPK userRoleHolderPK = (UserRoleHolderPK) object; 
      return userId == userRoleHolderPK.userId && projectId == userRoleHolderPK.projectId; 
     } else { 
      return false; 
     } 
    } 

    public int hashCode() { 
     return (int) (userId + projectId); 
    } 
} 

userId 및 projectId는 다른 모델의 사용자입니다. (User.java와 Project.java) 그리고 'UserRoleHolder'클래스에서 아래와 같이 'findRolesById'라는 메소드를 만들었습니다.

public static List<? extends Role> findRolesById(Long userId, Long projectId) { 
    return find 
      .where() 
      .eq("userRoleHolderPK", new UserRoleHolderPK(userId, projectId)) 
      .findUnique().roles; 
} 

그러나 아래와 같은 테스트 코드를 실행하려고하면 심각한 오류가 발생했습니다.

@Test 
public void findRolesById() { 
    // Given 
    // When 
    @SuppressWarnings("unchecked") 
    List<UserRole> list = (List<UserRole>) UserRoleHolder.findRolesById(1l, 1l); 
    // Then 
    assertThat(list.get(0).name).isEqualTo("manager"); 
} 

오류 SQL 문

'구문 오류 "? WHERE T0.NULL [*] = T0 USER_ROLE_HOLDER FROM T0.USER_ID C0, C1 T0.PROJECT_ID 선택"과 같다; 예상 "식별자"; SQL 문 : user_role_holder t0에서 t0.user_id c0, t0.project_id c1을 선택하십시오. 여기서 t0.null =? [42001-158] 바인딩 값 : [null] 쿼리 : select t0.user_id c0, t0.project_id c1 from user_role_holder t0 여기서 t0.null =?

JPA를 사용할 때 심각하고 기본적인 것들을 놓친 것 같습니다. 문제가 무엇인지 알려주세요.

+0

전체 내장 된 ID 대신 실제로 열을 비교하려고 했습니까 ?? .eq ("userRoleHolderPK.userId", userId) –

답변

1

당신의 문제는 Embeddedid 객체와 필드가 아닌 객체를 비교하려는 것이고, 프로그램이 사용자 객체 비교 (equals)를 다음과 같이 변환하는 방법을 알만큼 충분히 똑똑하다고 생각하지 않는다고 생각합니다. SQL을 사용하면 다음과 같은 것을 시도 할 수 있습니다.

public static List<? extends Role> findRolesById(Long userId, Long projectId) { 
    return find 
      .where() 
      .eq("userRoleHolderPK.userId", userId) 
      .eq("userRoleHolderPK.projectId", projectId) 
      .findUnique().roles; 
} 
+0

감사합니다. 나는이 프로젝트를 끝내지 않아서 당신의 답을 시험 할 수 없다. 어쨌든, 나는 당신의 대답이 매우 합리적이라고 생각하고 언젠가 그것을 시도 할 것입니다. 아마도. 감사 ! – byron1st