无法显示模板中关系的数据

Unable to display data from relationships in templates

我一直试图在 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);
}

和 Farmer 模型:

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();
    }
}

请注意,存在一个一对一的用户模型,其获取类型设置为 eager。现在,我想在我的模板中显示农民的数据,其中农民的名字实际上是关联用户模型中的名字。

所以我在我的控制器中这样做了:

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):

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

我错过了什么?

如评论中所述,这是因为 play-enhancer 根本不适用于视图或任何 Scala 代码。由于 Twirl 将 scala.html 代码编译为 scala 代码,因此增强器未触及此编译代码。

解决方案是为关系手动创建 get:

public class Farmer extends Model {

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

}

这是 Java 代码,然后将按预期处理。当然,您必须更改视图以使用 farmer.getUser 而不是 farm.user


此外,如文档中所述,字节码增强涉及一些魔法。但是你完全可以避免它,只使用常规的 POJO(明确声明的 gets 和 sets)。