JSF格式中可以为null的java属性
在JSF形式中,有:
<h:inputText value="#{personBean.person.personDetail.attribute}" />
实体Person
是从PostConstruct
注释方法上的数据库加载的。但是,Person
实例的属性personDetail
可以为空。因此,当填写输入并提交表单时,抛出异常(更具体地说javax.el.PropertyNotFoundException: (...) Target Unreachable, ''personDetail'' returned null
)
我搜索并找到了一些解决此异常的优秀示例,例如:
但是,我认为这个问题是不同的。找到了person
实例,其实例属性可以为null
我还尝试在PostConstruct
方法上设置一个新的PersonDetail
实例,当它为null时,但由于“对象(personDetail
)引用了一个未保存的临时实例”,因此问题变成了一个持久性问题
那么,如何看待这个问题呢
来源
短背豆:
@Named(value = "personBean")
@ViewScoped
public class PersonBean {
(...)
@PostConstruct
public void init() {
person = personService.findById(1L);
// throw -> TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
// if (person.getPersonDetail() == null) {
// person.setPersonDetail(new PersonDetail());
// }
(...)
}
}
短实体类:
@Entity
public class Person {
(...)
@OneToOne(mappedBy = "pessoa", fetch = FetchType.LAZY)
private PersonDetail personDetail;
// Getters and Setters
}
-
public class PersonDetail {
private String attribute;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id", unique = true, nullable = false)
private Person person;
// Getters and Setters
}
# 1 楼答案
解决方案的第一部分是实例化personDetail,当它为null时,第二部分是在插入数据库之前进行检查