有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    解决方案的第一部分是实例化personDetail,当它为null时,第二部分是在插入数据库之前进行检查

    if the personDetail.getAttributes != null then insert it else insert null