【问题标题】:JPA - Inject or instantiate custom attributes/object for JSF write access?JPA - 为 JSF 写访问注入或实例化自定义属性/对象?
【发布时间】:2011-10-18 06:59:39
【问题描述】:

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

Person 如何正确引用地址?

这边:

@Entity
public class Person {

    @Column
    @Inject
    Address adr;
}

或者像这样:

@Entity
public class Person {

    @Column
    Address adr = new Address();
}

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

您如何解决实体中的其他问题?我错过了什么吗?顺便说一句:我使用 openJPA 和 Webbeans

【问题讨论】:

    标签: java jakarta-ee jsf-2 jpa-2.0


    【解决方案1】:

    我会在您明确创建一个新的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;
        }
    
        // ...
    }
    

    【讨论】:

    • 很好的解决方案,这给了我 2 个选项来做这些事情。谢谢
    【解决方案2】:

    您可以尝试定义一个构造函数来初始化变量的默认值。这样,无论何时创建对象,它都会先运行构造函数,然后再从数据库中应用任何值。假设您的地址对象在数据库中没有空值,则此方法有效。 通常,尽管您希望在引用如此深入的对象遍历之前使用空检查,因为如果您尚未验证数据条目和/或表没有空约束,则您的数据可能具有空值。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 2011-11-13
        • 2016-06-05
        • 2021-09-24
        相关资源
        最近更新 更多