我有一个关于访问模型对象的成员变量的简单问题。
我有以下模型对象:
@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/