Java JPA-为JSF写访问注入或实例化自定义属性/对象?

Java JPA-为JSF写访问注入或实例化自定义属性/对象?,java,jakarta-ee,jsf-2,jpa-2.0,Java,Jakarta Ee,Jsf 2,Jpa 2.0,我正在使用OpenJPA,想知道如何引用另一个自定义实体。让我们假设有一个人和一个地址。两者都是我的建模实体 此人如何正确地引用地址 这样: @Entity public class Person { @Column @Inject Address adr; } 或者像这样: @Entity public class Person { @Column Address adr = new Address(); } 我更愿意注入或实例化的原因是,当我访

我正在使用OpenJPA,想知道如何引用另一个自定义实体。让我们假设有一个人和一个地址。两者都是我的建模实体

此人如何正确地引用地址

这样:

@Entity
public class Person {

    @Column
    @Inject
    Address adr;
}
或者像这样:

@Entity
public class Person {

    @Column
    Address adr = new Address();
}
我更愿意注入或实例化的原因是,当我访问这样的地址时,我看到空指针异常:
{myBean.personA.adr.street}
因为当对象不是从现有记录加载,而是在创建新记录时使用时,adr返回null


您如何解决实体中的auch问题?我是不是错过了什么。?顺便说一句:我使用openJPA和Webbeans,您可以尝试定义一个构造函数来初始化变量的默认值。这样,无论何时创建对象,它都会在应用数据库中的任何值之前首先运行构造函数。假设您的address对象在数据库中没有空值,则可以这样做。
通常情况下,虽然您希望在引用深度较大的对象遍历之前使用null检查,但如果您尚未验证数据条目和/或表没有not null约束,则数据可能具有null值

我不建议直接从JSF页面引用实体。您可以先将表单数据保存到一些中间对象中,然后调用一些EJB服务,该服务将从临时对象初始化实体并将其持久化。

我将在显式创建新的
人员时创建它

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

    // ...
}