JPA - внедрить или создать пользовательские атрибуты / объект для доступа к записи JSF? - PullRequest
1 голос
/ 18 октября 2011

Я использую OpenJPA и мне было интересно, как ссылаться на другой пользовательский объект. Давайте предположим, что есть человек и адрес. Оба являются моими смоделированными сущностями.

Как Персона правильно будет обращаться к Адресу?

Таким образом:

@Entity
public class Person {

    @Column
    @Inject
    Address adr;
}

или как это:

@Entity
public class Person {

    @Column
    Address adr = new Address();
}

Причина, по которой я скорее хочу внедрить или создать экземпляр, заключается в том, что я вижу исключение нулевого указателя при доступе к Address следующим образом: #{myBean.personA.adr.street} потому что adr возвращает ноль, когда объект не загружен из существующей записи, но используется при создании новой

Как вы решаете все проблемы в ваших организациях? Я скучаю по чему-то? Кстати: я использую openJPA и Webbeans

Ответы [ 3 ]

0 голосов
/ 18 октября 2011

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

0 голосов
/ 18 октября 2011

Я бы создал его в точке, где вы явно создаете новый Person.

@ManagedBean
@ViewScoped
public class Register {

    private Person person;

    @PostConstruct
    public void init() {
        person = new Person();
        person.setAddress(new Address());
    }

    // ...
}

Или, альтернативно, выполните работу в Person, чтобы вам не нужно было повторять ее:

@ManagedBean
@ViewScoped
public class Register {

    private Person person;

    @PostConstruct
    public void init() {
        person = Person.create();
    }

    // ...
}

с

@Entity
public class Person {

    public static Person create() {
        Person person = new Person();
        person.setAddress(new Address());
        return person;
    }

    // ...
}
0 голосов
/ 18 октября 2011

Вы можете попробовать определить конструктор для инициализации значений по умолчанию для ваших переменных.Таким образом, каждый раз, когда ваш объект создается, он сначала запускает конструктор, прежде чем применять какие-либо значения из базы данных.Это работает, если ваш адресный объект не имеет нулевого значения в базе данных.Как правило, хотя вы хотите использовать нулевые проверки перед тем, как обратиться к такому глубокому обходу объекта, поскольку ваши данные могут иметь нулевые значения, если вы еще не проверяете ввод данных и / или таблицы не имеют нулевых ограничений.

...