Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 在Play 2.0中访问模型对象属性的Scala模板_Templates_Playframework_Playframework 2.0 - Fatal编程技术网

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实现区