在Spring-Hibernate项目中初始化实体集合(POJO)的正确方法是什么?

edi*_*dio 7 java architecture collections spring hibernate

我有一个POJO类,比如Foo,它有一组其他实体实例,比如说吧.此类项目还有标准的misc类:Foo和Bar的服务和dao.

我希望BarService获得与某些Foo相关联的Bar实例集.现在我有以下代码,我相信它在概念上很糟糕.

 
public class Foo {
    Set<Bar> bars;

    public Set<Bar> getBars() {
        if (bars == null)
            return ( bars = new HashSet() );
        return bars;
    }
}
Run Code Online (Sandbox Code Playgroud)
 
public class BarServiceImpl {
    public List<Bar> getListOfBars(Foo foo) {
        return new ArrayList(foo.getBars());
    }
}
Run Code Online (Sandbox Code Playgroud)

3个问题:初始化Foo's Set哪个更好?哪些特定的集合和列表更适合此类目的?我目前的实施有哪些概念性问题,以及如何做得更好?

提前致谢.

Pas*_*ent 12

在哪里初始化Foo的Set更好?

大多数时候,我在声明它时初始化集合,这是Hibernate推荐的.引用文档:

6.1.持久收藏

Hibernate要求将持久的集合值字段声明为接口类型.例如:

public class Product {
    private String serialNumber;
    private Set parts = new HashSet();

    public Set getParts() { return parts; }
    void setParts(Set parts) { this.parts = parts; }
    public String getSerialNumber() { return serialNumber; }
    void setSerialNumber(String sn) { serialNumber = sn; }
}
Run Code Online (Sandbox Code Playgroud)

实际的界面可能是 java.util.Set, java.util.Collection, java.util.List,java.util.Map, java.util.SortedSet, java.util.SortedMap或任何你喜欢("任何你喜欢的类型"代表你需要编写的实现 org.hibernate.usertype.UserCollectionType.)

注意实例变量是如何使用实例初始化的 HashSet.这是初始化新实例化(非持久)实例的集合值属性的最佳方法.当你使实例持久化时,通过调用persist()例如,Hibernate实际上会替换 HashSet一个Hibernate自己实现的实例 Set.

如果离开它null是您业务的一部分,我的建议是用(通用)链接管理方法初始化它:

public class Foo {
    ...
    private Set<Bar> bars;
    ...
    public void addBar(Bar bar) {
        if (this.bars == null) {
            this.bars = new HashSet<Bar>();
        }
        this.bars.add(bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

哪些特定的集合和列表更适合此类目的?

这一切都取决于你需要的语义.A Set不允许重复,List允许重复并引入位置索引.

我目前的实施有哪些概念性问题,以及如何做得更好?

  1. 不会在getter中执行任务.
    • 如果一个集合应该null在那一点,那就让它成为null.
  2. 我没有看到您服务的附加价值
    • 为什么不只是打电话foo.getBars()
    • 为什么转换收藏?