Templates 在Play 2.0中访问模型对象属性的Scala模板
关于访问模型对象的成员变量,我有一个简单的问题 我有以下模型对象:Templates 在Play 2.0中访问模型对象属性的Scala模板,templates,playframework,playframework-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; @OneToOn
@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时,这就不再有效了
提前谢谢你
Richard这是因为JPA使用方面来拦截getter的使用,并从延迟加载的对象中填充缺少的数据。我不知道什么是传统思维,但我不会让公众成员参与JPA,因为这会打破一贯的框架 如果确实要使用公共成员,则必须将关系标记为急切获取:
@OneToMany(fetch=FetchType.EAGER)
或者显式获取模板(ugh)中所需的所有对象树
在您的案例中,关系的另一端定义了一个OneToOne,如果您在帐户端定义它,那么它在默认情况下应该会自动恢复。我忘了,如果你能在两个实体上定义OneToOne,我想你能,但你可能不得不稍微修改一下
总的来说,不要在JPA中使用公共成员,它会崩溃。更好的是,抛弃JPA,改用Anorm,它比JPA更成功地映射到问题域。像这样的问题始终会导致JPA实现占用的实现时间是任何人能够预测的两倍。这是因为JPA使用方面来拦截getter使用情况,并从延迟加载的对象中填充缺少的数据。我不知道什么是传统思维,但我不会让公众成员参与JPA,因为这会打破一贯的框架 如果确实要使用公共成员,则必须将关系标记为急切获取:
@OneToMany(fetch=FetchType.EAGER)
或者显式获取模板(ugh)中所需的所有对象树
在您的案例中,关系的另一端定义了一个OneToOne,如果您在帐户端定义它,那么它在默认情况下应该会自动恢复。我忘了,如果你能在两个实体上定义OneToOne,我想你能,但你可能不得不稍微修改一下
总的来说,不要在JPA中使用公共成员,它会崩溃。更好的是,抛弃JPA,改用Anorm,它比JPA更成功地映射到问题域。像这样的问题总是导致JPA实现占用的实现时间是任何人能够预测的两倍。我刚刚偶然发现了Guillaume Bort发布的一个答案,解释了这一点。 请看这里:
希望这有帮助 我刚刚偶然发现了纪尧姆·博尔特(Guillaume Bort)发布的一个答案,解释了一些事情。 请看这里:
希望这有帮助 由于延迟加载,只有当您从类本身访问字段中的值时,才会加载字段中的值。(在正常情况下,会使用setter/getter) 为了加载值,必须编写getter和setter。 或者您可以创建一个检查每个值的方法 您可以将以下方法添加到您的帐户实体:
public void checker(){
if(email==null){}
if(password==null){}
if(person==null){}
}
这将加载每个值,但不会降低性能,因为延迟加载字段中的值只能在从类本身访问它们时加载(在正常情况下使用setter/getter) 为了加载值,必须编写getter和setter。 或者您可以创建一个检查每个值的方法 您可以将以下方法添加到您的帐户实体:
public void checker(){
if(email==null){}
if(password==null){}
if(person==null){}
}
这将加载所有值,但不会降低性能Hi PlexQ!感谢您的响应!这种行为非常奇怪,与Play!framework一样!我们鼓励您在类中使用公共成员。我看到了JPA(在我的例子中是Ebean,它是Play!2.0中的默认值)使用方面来执行延迟加载。但是人们可能会认为这会像上面提到的那样起作用。再次感谢!我会给你分数,因为我似乎不会从社区得到关于这一点的完整答案。另一个想法浮现在脑海中:我想知道使用静态编织是否会比加载时编织更好?我可以发誓我会记住ber可以点切字段访问,但我使用的JPA实现似乎没有。您使用的是哪个JPA提供程序?EBean实现作为Play!2.0框架中的默认ORM提供程序分发。直到Play!附带了它,我才听说它。嗨,PlexQ!感谢您的响应!这种行为非常奇怪,就像Play!framework鼓励您在类中使用公共成员。我了解JPA(在我的例子中是Ebean,它是Play!2.0中的默认值)是如何工作的使用方面来执行延迟加载。但是人们可能会认为这会像上面提到的那样起作用。再次感谢!我会给你分数,因为我似乎不会从社区得到关于这一点的完整答案。另一个想法浮现在脑海中:我想知道使用静态编织是否会比加载时编织更好?我可以发誓我会记住ber有可能点切字段访问,但我使用的JPA实现似乎没有。您使用的是哪个JPA提供程序?EBean实现区