2016-12-23 6 views
0

Twirl 템플릿 (Play Framework Java - 2.5.10 사용)에서 일대일 관계에 대한 데이터를 표시하려고했습니다.템플릿에서 관계의 데이터를 표시 할 수 없습니다.

package models; 

import java.sql.Date; 
import javax.persistence.*; 
import com.avaje.ebean.Model; 

@Entity 
@Table(name = "users") 
public class User extends Model { 
    @Id 
    @Column(name = "id") 
    public Long id; 

    @Column(name = "first_name") 
    public String firstName; 

    @Column(name = "middle_name") 
    public String middleName; 

    @Column(name = "last_name") 
    public String lastName; 

    @Column(name = "date_of_birth") 
    public Date dateOfBirth; 

    @Column(name = "sex") 
    public String sex; 

    @OneToOne 
    @JoinColumn(name = "time_zone_id") 
    public TimeZone timeZone; 

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

와 농부 모델 : 열망으로 설정 일대일 사용자 모델로 가져 오기 유형이있다

package models; 

import com.avaje.ebean.Model; 

import javax.persistence.*; 
import java.util.List; 

@Entity 
@Table(name="farmers") 
public class Farmer extends Model { 
    public enum Status {INACTIVE, ACTIVE} 

    @Id 
    @Column(name="id") 
    public Long id; 

    @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinColumn(name="user_id") 
    public User user; 

    @Column(name="profile_pic_url") 
    public String profilePicUrl; 

    @Column(name="access_url") 
    public String accessUrl; 

    @Column(name="status") 
    public String status = Status.INACTIVE.name(); 

    @OneToMany(mappedBy = "farmer", targetEntity = Farm.class, fetch = FetchType.LAZY) 
    public List<Farm> farms; 

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

    public static List<Farmer> getAllActive() { 
     return Farmer.find.where().eq("status", Status.ACTIVE.name()).findList(); 
    } 
} 

공지 사항 기본적으로 나는 사용자 모델을 가지고있다. 이제 농부의 데이터를 내 템플릿에 표시하려고합니다. 여기서 농부의 이름은 실제로 연결된 User 모델의 이름입니다.

public class FarmerController extends Controller { 
    public Result all() { 
     return ok(farmers.render(Farmer.getAllActive())); 
    } 
    public Result farmer(Long id, String url) { 
     return ok(farmer.render()); 
    } 
} 

지금이 나에게 바로 농부 데이터를 가져가,하지만 난 사용자 모델을 통해 이름을 표시 할 때, 나는 널 수 :

그래서 난 내 컨트롤러에 이런 짓을. 보다 구체적으로,이 글이 쓰여지는 (사실, 내가 nullnull를 얻을) 널 (null) 결과 : 나는 무엇을 놓치고

<div><h4>@(farmer.user.firstName + farmer.user.lastName)</h4></div> 

?

+1

[play-enhancer] (https://www.playframework.com/documentation/2.5.x/PlayEnhancer)를 사용하고 있습니까? 제대로 기억한다면 모델 인핸서가 뷰를 위해 작동하지 않습니다. 그래서,'Farmer' 모델 안에서'getUser' 메소드를 생성하고 그것을 사용하도록 뷰를 수정해야합니다. – marcospereira

+0

@marcospereira 흠, 고마워요. 참으로 enhancer 플러그인을 사용하고 있습니다. 예를 들어 'Farmer.find.fetch ("user")를 반환하도록 변경하여 예제를 얻을 수 있었지만 where(). eq ("status", Status.ACTIVE.name()). findList(); '나는 관계의 긴 사슬을 횡단하기 위해 계속 할 수 있다고 생각하지 않는다. 그러나 뷰에서 함수를 호출하지 않았으므로'@ farmer.getUser(). firstName()'과 같이 간단하기를 바랍니다. – dotslash

+1

@marcospereira 고맙습니다. 동의 할 수 있도록 아래의 답변으로 추가 할 수 있습니까? :-) (사이드 노트에서 나는이 인핸서 플러그인을 싫어한다 - 그것은 문서에서 마법으로 선전되고 있지만 마술처럼 효과가 없다). – dotslash

답변

0

주석에서 설명한 것처럼 재생 확장 기능은보기 또는 스칼라 코드에서 전혀 작동하지 않기 때문입니다. Twirl은 코드 scala.html을 스칼라 코드로 컴파일하므로이 컴파일 된 코드는 확장 프로그램에 의해 수정되지 않습니다.

이 솔루션은 수동으로 관계를 가져 오기를 만드는 다음입니다 :

public class Farmer extends Model { 

    public User getUser() { 
     return this.user; 
    } 

} 

예상대로 처리됩니다 다음 자바 코드입니다. 물론 farm.user 대신 farmer.getUser을 사용하도록보기를 변경해야합니다.


또한 문서에서 언급 한 것처럼 바이트 코드 향상에는 몇 가지 마법이 필요합니다. 그러나 당신은 그것을 전혀 피할 수 있고 (POJO를 명시 적으로 선언 된 gets와 set으로) 사용할 수 있습니다.

관련 문제