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 モデルとの 1 対 1 があることに注意してください。ここで、テンプレートに農家のデータを表示したいと思います。農家の名前は、実際には関連付けられた 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>

私は何が欠けていますか?

4

1 に答える 1

0

コメントで説明されているように、これは play-enhancer がビューや Scala コードに対してまったく機能しないためです。Twirlscala.htmlはコードを scala コードにコンパイルするため、このコンパイルされたコードはエンハンサーによって変更されません。

解決策は、リレーションシップの get を手動で作成することです。

public class Farmer extends Model {

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

}

これは Java コードであり、期待どおりに処理されます。もちろん、ビューをfarmer.getUserの代わりに使用するように変更する必要がありますfarm.user


また、ドキュメントに記載されているように、バイトコードの拡張には魔法が必要です。ただし、それをまったく回避して、通常の POJO を使用することもできます (明示的に宣言された get と set を使用)。

于 2016-12-31T02:38:40.730 に答える