Java EE - 执行最少逻辑的实体吸气剂

Java EE - Entity getters doing minimal logic

我正在使用 JPA.I 开发一个 java 企业应用程序,我会通过示例来解释我的疑问。

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

public class EntityA {

private List<EntityB> listOfB;

*getter and setter for listOfB*

}

无论如何,我都不希望我的 getter for listOfB 为 return null。 如果 listOfB 为 null,我可以在代码中初始化它的最佳点是什么?

我想到的第一个解决方案是修改 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 功能的交互而发生任何问题。我也想知道前面提到的三个解决方案可能引发的任何问题。

怎么样:

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

JPA 工具现在以这种方式从表中生成实体,这在 JPA 中运行良好。


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

@Entity
public class Entity implements java.io.Serializable {

    private OtherEntity otherEntity = new OtherEntity ();

    private Set<EntityTwo> entityTwos= new HashSet<EntityTwo>(0);

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


实体getter正在执行最少的逻辑

A Getter肯定是这个地方写错了。在您的示例中,getter 更改了对象的状态,这是您对 getter 所不期望的。

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