2012-06-27 2 views
2

Play Framework 2의 문제가 여기 있습니다. 두 개의 클래스가 있습니다Ebean Play 프레임 워크 2 many-to-many 연관로드

@Entity 
public class User extends Domain { 

    @Id 
    public Long id; 
    public String name; 
    public String surname; 
    public String phoneNumber; 

    @Lob 
    public String comment; 

    @ManyToMany 
    public Set<Band> groups = new HashSet(); 
} 

@Entity 
public class Band extends Domain { 

    @Id 
    public Long id; 

    public String name; 

    @Lob 
    public String comment; 

    @ManyToMany(mappedBy="groups") 
    public Set<User> users = new HashSet(); 
} 

그리고 User.groups 접근의 문제는. 다음

System.out.println(user.groups); 

수익을 수행 :

BeanSet 정확히 this 문제처럼

을 연기. 그래서 문제는 그것이로드되도록하기 위해서 무엇인가해야합니까?

그러나이 코드를 실행하면 모든 것이 예상대로 이루어집니다.

Band.find.all(); 
System.out.println(user.groups); 

이러한 동작의 이유는 무엇입니까?

P. 도메인 클래스는 정적 메서드가 거의없는 모델 상속자입니다.

+1

보다 더 낫다

import play.Logger; 

나는 이것이 원인인지 잘 모르겠지만, 그것과 관련이있을 수 있습니다. EBean은 ManyToMany 관계를 다르게 처리합니다 ... 다른 차이점과 함께 계단식 유형을 명시 적으로 설정해야합니다 (모든 것을 기억하지 않고 사용 중지하고 최대 절전 모드로 전환했습니다). 시도 할 수있는 한 가지는 사용자에서 매핑을 지정하는 것입니다. 그 괴상한 밴드에서 작동하지만 ... 또한 캐스케이드 유형을 설정하려고합니다. –

+0

BTW : Whye는 모델 클래스가'Model' 대신'Domain'을 확장합니까? – biesior

+0

@MarcusbiesiorBiesioroff, Domain은 내 자신의 제네릭 CRUD 컨트롤러를 다루기위한 몇 가지 일을 유지하기 위해 Model의 계승자입니다. 질문을 조금 편집하겠습니다. –

답변

3

user.groupsSet<Band>이므로 Band 유형이 아닙니다. 당신은 (당신이 아직하지 않은 경우)

먼저 만들고 수업에 Finder을 필요로 ... 그 물마루 반복해야합니다

User:

public static Finder<Long, User> find 
     = new Finder<Long, User>(Long.class, User.class); 

Band:

public static Finder<Long, Band> find 
     = new Finder<Long, Band>(Long.class, Band.class); 

다음으로 allUsers를 반입하고 반복해야합니다 (List<User>). 반복 내부에는 Set<Band> (avai) user.groups로 LABLE : 물론

List<User> allUsers = User.find.all(); 
for (User user : allUsers) { 
    Logger.info("User's name is " + user.name); 
    for (Band group : user.groups) { 
     Logger.info(user.name + " in group " + group.name); 
    } 
} 

당신이 즉, 하나의 Band을 찾을 때. Band.find.byId(1L)으로 반복 할 필요가 없습니다.

가져올 것을 잊지 마십시오 Logger : 그것은 System.out.println()

+0

'사용자의 반복 예제를 살펴보십시오.groups' :'for (Band group : user.groups) {}'은 예외로 작동합니다. 'println (Object)'대신'Logger.info (String)'을 사용하십시오. 다음 문제의 문제로 컨트롤러 코드를 어딘가에 붙여 넣고 모든 것을 보여줍니다. 내가 샘플을 보여 준 샘플은 모델에서 빌드되어 테스트되었으므로 올바르게 작동합니다. – biesior

+0

지연로드의 이유는 무엇입니까? Set의 toString()을 호출하면 실제로드가 수행되지 않습니까? 어쨌든 고마워, 잘 작동 해. 당신의 단 한 사람이 여기에 게임 프레임 워크를 사용하는 것처럼 보입니다. :) –

관련 문제