templates - Scala 模板在 Play 2.0 中访问模型对象属性

标签 templates playframework playframework-2.0

我有一个关于访问模型对象的成员变量的简单问题。

我有以下模型对象:

@Entity
public class Person extends Model{
    @Id 
    public Long id;
    public String name;
}

@Entity
public class Account extends Model{
    @Id
    public String email;
    public String password;
    @OneToOne
    public Person person;
}

到目前为止一切顺利,任何给定的都可以拥有一个帐户Account 对象是从 zentask 示例中复制的。身份验证后,我重定向到索引页面,该页面显示 Person.name 成员变量中所述的用户真实姓名。 Account 对象被插入到页面中,就像 zentasks 示例一样:

Account.find.byId(Controller.request().username());

现在模板中发生了以下奇怪的事情,我不明白:

@account.person.name

调用时会导致在模板中插入 Null 值:

@account.person.getName()  or   @account.person.getName

从 person 对象插入正确的名称,结果符合预期。

@account.person

显示 person 对象的 .toString(),也正确显示名称。

总结一下:上面的代码有什么问题?为什么我可以毫无问题地调用 account.person 值,但是当我调用 account.person.name 时,这不再起作用

提前谢谢您!

理查德

最佳答案

这是因为 JPA 使用 Aspects 来拦截 getter 使用并填充延迟加载的对象中缺失的数据。我不知道传统思维是什么,但我不会在 JPA 中使用公共(public)成员,因为这个原因,它会持续破坏框架。

如果您确实想使用公共(public)成员,则必须将关系标记为急切获取:

@OneToMany(fetch=FetchType.EAGER)

或者显式获取模板中需要的所有对象树(呃)。

在您的情况下,关系的 OneToOne 是在关系的另一端定义的,如果您在帐户端定义它,则默认情况下它应该获取 eager。我忘记了您是否可以在两个实体上定义 OneToOne,我认为您可以,但您可能需要稍微修改一下。

总的来说,不要在 JPA 中使用公共(public)成员,它会崩溃。更好的是,放弃 JPA 并使用 Anorm,它比 JPA 更成功地映射到问题域。此类问题始终导致 JPA 实现所花费的实现时间是任何人预测的两倍。

关于templates - Scala 模板在 Play 2.0 中访问模型对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9924560/

相关文章:

Angular 5 : Can't update template with async pipe

c++ - decltype 类型表达式

c++ - 函数模板 - 编译器在使用相同类型调用时选择具有不同参数类型的函数

scala - 使用 Play 减小 Heroku 的 slug 大小! 2.0 & Scala

scala - 基于 bool 值填充枚举集

node.js - 哈巴狗模板中的链接 href

performance - 什么会导致 Intellij 在使用 Scala 时突然变得很慢?

java - sbt编译play框架应用报错

playframework-2.0 - 如何使用 sbt(不 Play )构建 Play Framework 示例应用程序?

java - 从 play framework 2.0.8 迁移到 2.1.0 错误 : cache play already exists