2016-12-23 32 views
0

Twirlテンプレート(Play Framework Java - 2.5.10を使用)で1対1リレーションシップのデータを表示しようとしています。基本的に私は、Userモデルを持っている:テンプレート内のリレーションシップからデータを表示できません

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モデルと一対一にあります。ここでは、農家のデータをテンプレートに表示するとします。農家の名前は、実際に関連付けられた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()); 
    } 
} 

は今、これは私の右の農家データを取得しますが、私はUserモデルを経由して名を表示しようとすると、私はnullを取得します。具体的には、書き込みこれは(実際には、私はnullnullを得る)ヌルになり:私は何をしないのです

<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うーん、ありがとう。私は本当にエンハンサープラグインを使用しています。例を得るには、 '' Farmer.find.fetch( "user")を返すように変更してください。 「私は長い間の関係を辿るためにそれをやり続けることはできないと思う。しかし、私はビューから関数を呼び出さなかったので、 '@ farmer.getUser()。firstName()'のようにシンプルであることを願っています。 – dotslash

+1

@marcospereiraありがとう、これは働いた!私が受け入れることができるようにこれを以下の答えとして追加できますか? :-)(サイドノートでは、このエンハンサープラグインが嫌いです。ドキュメントの魔法として宣伝されていますが、魔法と同様に動作しません)。 – dotslash

答えて

0

コメントで説明したように、これは再生エンハンサーがビューやScalaコードではまったく機能しないためです。 Twirlはscala.htmlコードをスカラーコードにコンパイルするので、このコンパイルされたコードはエンハンサーによって触れられません。

public class Farmer extends Model { 

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

} 

これは、Javaコードで、その後、期待通りに処理されます。

ソリューションは、手動での関係のために取得を作成するために、その後です。もちろん、farm.userの代わりにfarmer.getUserを使用するようにビューを変更する必要があります。


また、ドキュメントで述べたように、バイトコードの強化にはいくつかの魔法が必要です。しかし、あなたはそれをまったく避けて、普通のPOJO(明示的に宣言されたgetとsetを使って)だけを使うことができます。

関連する問題