【问题标题】:Java EE - Entity getters doing minimal logicJava EE - 执行最少逻辑的实体获取器
【发布时间】:2015-03-16 02:32:09
【问题描述】:

我正在使用 JPA 开发一个 Java 企业应用程序。我将通过一个示例来解释我的疑问。

我的 EntityA 有一个字段(使用连接表保存在数据库中),表示 EntityB 的列表,如下所示。

public class EntityA {

private List<EntityB> listOfB;

*getter and setter for listOfB*

}

在任何情况下,我都不希望我的 listOfB 获取器返回 null。 如果 listOfB 为空,我可以在代码中初始化 listOfB 的最佳点是什么?

我想到的第一个解决方案是修改getter:

public List<EntityB> getListOfB(){
   if(listOfB == null)
      listOfB = new ArrayList<EntityB>();

   return listOfB;
}

然后我考虑使用带有@PostConstruct 标记的方法:

@PostConstruct
public void postConstruct() {
   if(listOfB == null)
      listOfB = new ArrayList<EntityB>();
}

我猜另一种选择是修改构造函数。

最好的方法是什么?最重要的是我问这个,因为我不希望由于与 JPA 功能的交互而发生任何问题。我也想知道前面提到的三个解决方案可能引发的任何问题。

【问题讨论】:

    标签: jakarta-ee jpa entity


    【解决方案1】:

    怎么样:

    public class EntityA {
        private List<EntityB> listOfB = new ArrayList<EntityB>();
    

    JPA 工具现在以这种方式从表中生成实体,这适用于 JPA。


    如果您只是想确保 List 已初始化(因此不为 null),这是一个非常好的解决方案。 JPA 工具似乎更进一步,并初始化了对其他实体的所有引用。例如:

    @Entity
    public class Entity implements java.io.Serializable {
    
        private OtherEntity otherEntity = new OtherEntity ();
    
        private Set<EntityTwo> entityTwos= new HashSet<EntityTwo>(0);
    

    我同意,初始化 Lists 或 Sets (OneToMany) 是有意义的,因为 List 可以是空的。初始化另一个实体的对象有点奇怪(OneToOne,ManyToOne),因为引用可能不存在。但这就是 JPA 工具生成的。


    执行最少逻辑的实体获取器

    Getter 绝对是错误的地方。在您的示例中,getter 更改了对象的状态,这是您对 getter 不期望的。

    @PostConstruct 中的初始化字段是一个可行的解决方案。但我更喜欢用它来初始化具有特定值或更多逻辑的字段。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2015-03-02
    • 2011-11-23
    • 2011-07-03
    相关资源
    最近更新 更多