2011-04-01 3 views
2

우리 팀은 위키 피 디아와 유사한 페이지 편집과 관련된 애플리케이션을 코딩하고 있습니다. 그것은 우리가 등록을 가지고있는 문제와 유사하다 :POJO를 사용하여 복잡한 JPA 엔티티를 컨트롤러에 전달

직접적인 구현은

public static void doRegistration(User user) { 
//... 
} 

사용자 매개 변수는 JPA 엔티티입니다 같은 것을 제공합니다. 나는이 실패 herethere을 읽고

@Entity 
public class User extends Model { 

//some other irrelevant fields 

@OneToMany(cascade = CascadeType.ALL) 
public Collection<Query> queries; 

@OneToMany(cascade = CascadeType.ALL) 
public Collection<Activity> activities; 
//... 

: 사용자 모델은 다음과 같이 보입니다. 이제 Play!에서 우리가 취할 수있는 최선의 행동은 무엇입니까? 하나의 객체에 서버로 가야하는 모든 데이터를 저장하고 데이터베이스에 쉽게 저장할 수있는 방법이 있어야합니다.

편집 :이 실패 이유는 유효성 검사가 실패했기 때문입니다. 그것은 어떻게 든 콜렉션 객체의 유효성을 검사 할 때 "잘못된 값"이라고 말합니다. 나는 이것이 피할 수 있는지 궁금 해서요.

해결 방법 : 컬렉션을 목록으로 변경하면 문제가 해결되었습니다. 이 연극에서이 작품

+0

'Query '와'Activity'가 엔티티가 아니라는 것을 암시하고 있습니까? – Jeremy

+0

@Jeremy 신속한 답변에 감사드립니다. 컬렉션은 모두 개체로 구성됩니다. 데이터베이스는 지속적이며 작동합니다. – Jasper

답변

1

를 미리 1.2 :

감사를 고정하는 버그입니다. 더 명확하게하기 위해 작성한 컨트롤러 메소드를 정의 할 수 있습니다.

public static void doRegistration(User user) { 
//... 
} 

괜찮습니다. POST 경로에 매핑하고 # {form}을 사용하여 다음과 같이 개체를 제출하십시오.

#{form id:'myId', action:@Application.doRegistration()} 
    #{field user.id} 
    [...] 
#{/form} 

이것은 작동합니다. 양식에 엔티티의 모든 필드를 추가하지 않으면 문제가 발생할 수 있습니다 (일부 필드를 편집 할 수없는 경우 here과 같이 숨겨진 입력 또는 NoBinding 어노테이션 사용).

편집 대상 : OneToMany 제목의 관계는 "많은"쪽에서 관리됩니다. 그 쪽은 관련된 엔티티의 id를 숨겨진 필드 (object.user.id의 값)로 유지해야합니다. 이것은 관련된 모든 문제를 해결할 것입니다.

+0

나는 그것을 정말로 이해하지 못한다. 문제는 어떤 이유로 Play에서 User 모델의 컬렉션을 확인하지 않는다는 것입니다. 사용자의 ID를 추가하여 문제를 해결할 수 있다고 말합니까? 유효성 검사를 비활성화하면 등록이 잘 작동하기 때문에 – Jasper

+1

그러나 문제는 방법과 관련이 없지만 유효성 검사 (질문에서 명확하지 않음)가 원인입니다. Collection을 List/Set로 변경해야합니다. 그렇지 않으면 클래스가 올바른 것처럼 보입니다. 어쩌면 관련된 모든 클래스의 코드와 가져 오는 오류 메시지를 추가해야합니다. –

+0

댓글 기록의 greates 설명입니다. 컬렉션을 목록으로 변경하면 문제가 해결되는 것 같습니다. 감사! – Jasper

1

실패하지 않습니다. 실행중인 트랜잭션이 있으면 모든 것이 지속됩니다. 트랜잭션은 일반적으로 컨트롤러가 아닌 서비스 내에서 실행되므로 컨트롤러에서 서비스로 전달해야합니다.

관련 문제