Java JPA-为JSF写访问注入或实例化自定义属性/对象?
我正在使用OpenJPA,想知道如何引用另一个自定义实体。让我们假设有一个人和一个地址。两者都是我的建模实体 此人如何正确地引用地址 这样: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(); } 我更愿意注入或实例化的原因是,当我访
@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;
}
// ...
}