Шаблон Scala для доступа к свойствам объекта модели в Play 2.0 - PullRequest
2 голосов
/ 29 марта 2012

У меня есть простой вопрос о доступе к переменным-членам объекта модели.

У меня есть следующие объекты модели:

@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;
}

Пока все хорошо, любой заданный person можетесть один account.Объект Account скопирован из примера zentask.После аутентификации я перенаправляю на страницу индекса, где отображается реальное имя пользователя, как указано в переменной-члене Person.name.Объект Account вставляется на страницу так же, как в примере с zentasks, вот так:

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

Теперь в шаблоне происходят следующие странные вещи, которые я не понимаю:

@account.person.name

приводит к значению Null, вставленному в шаблон при вызове:

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

результат, как и ожидалось, с правильным именем, вставленным из объекта person.1024 * объекта person, также правильно отображающего имя.

Итак, подведем итог: что не так с кодом выше?Почему я могу назвать значение account.person без проблем, но когда я вызываю account.person.name, это больше не работает

Заранее спасибо!

Ричард

Ответы [ 3 ]

3 голосов
/ 31 марта 2012

Это связано с тем, что JPA использует аспекты для перехвата использования геттера и заполнения недостающих данных из ленивых объектов.Я не знаю, что такое традиционное мышление, но я бы не стал использовать публичные члены с JPA, по этой причине, это постоянно нарушит структуру.

Если вы действительно хотите использовать публичные члены, у вас будетчтобы пометить отношения как активные выборки:

@OneToMany(fetch=FetchType.EAGER)

или явным образом извлекать все дерево объектов, которое вам потребуется в вашем шаблоне (тьфу).

В вашем случае отношения - OneToOneопределяется на другой стороне отношения, если вы определяете его на стороне учетной записи, он должен получать по умолчанию.Я забыл, если вы можете определить OneToOne для обеих сущностей, я думаю, что вы можете, но вам, возможно, придется немного поиграться с ним.

В целом, не используйте публичные члены с JPA, это сломается.Еще лучше, если отказаться от JPA и использовать Anorm, он гораздо более успешно сопоставляется с проблемной областью, чем JPA.Подобные проблемы постоянно приводят к тому, что реализации JPA отнимают вдвое больше времени, чем может предвидеть каждый.

1 голос
/ 06 апреля 2012

Я только что наткнулся на ответ, опубликованный Гийомом Бором, который объясняет вещи. Читайте здесь:

https://groups.google.com/d/topic/play-framework/CNjH3w_yF6E/discussion

Надеюсь, это поможет!

0 голосов
/ 30 июня 2013

Из-за отложенной загрузки значения в поле загружаются только при доступе к ним из самого класса. (Что-то, что в нормальных условиях будет использовать метод установки / получения

Чтобы загрузить значения, которые вы, эфир, должны написать геттеры и сеттеры. Или вы можете создать метод, который проверяет каждое значение.

Вы можете добавить следующий метод в свою учетную запись:

public void checker(){

    if(email==null){}
    if(password==null){}
    if(person==null){}
}

это загрузит каждое значение, но не снизит производительность

...