无法显示模板中关系的数据
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)。
我一直试图在 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)。