hibernate:父级的子id检索列表

时间:2010-12-15 02:21:39

标签: java hibernate collections annotations one-to-many

技术:Hibernate 3.0

假设我有实体类公司

    @Entity
    @Table(name="tbl_companies")  
    public class Company
    {
            @Id
            @Column(name="id") 
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            int id;

            @Column(name="name")
            String companyName;

            @OneToMany(mappedBy = "company")
            List<Employees> empList;

            @OneToMany(mappedBy = "company")
            List<Projects>  projectList;

            @OneToMany(mappedBy = "company")
            List<Department> deptList;

            @OneToMany(mappedBy = "company")
            List<Branch>     branchList;       
    }

在通过hibernate注释映射到数据库的实体公司中,包含与其相关的其他实体的列表。由于这些实体的对象(如Branch,Project,Employee本身)是重型对象,因此它会使Company对象非常繁重并包含几乎整个db数据。避免这种情况的一种方法是使用延迟加载。另一种方法可以是使用List branchIdList,List projectIdList,它是对象的id列表。我的问题是哪种方法是标准做法,更适合在这种情况下使用。更好地使用包括内存方面的性能因素,程序员的灵活性(第一个是程序员灵活的,第二个是使用更少的内存)。另一个问题是,如果我使用第二种方法,注释会发生什么变化。我怀疑hibernate是否支持id列表或仅支持完全成熟的对象。

谢谢

2 个答案:

答案 0 :(得分:2)

  

另一种方法可以是使用List   branchIdList,列出projectIdList   是对象的ID列表。

在此之前请仔细考虑。使用ORM的全部意义在于DB中通过外键相互链接的行可以表示为通过常规Java引用和集合链接的对象。通过使用您概述的方案,您将失去使用Hibernate的大部分优势。

推荐的方法是使用延迟加载。

  

最好使用包括如下因素   在记忆方面的表现主要是,   程序员的灵活性(第一个   是一个灵活的程序员和   第二个使用更少的内存。)

恕我直言,你获得的记忆,如果有的话,不值得程序员的痛苦。

答案 1 :(得分:1)

  

我想,你必须先看到你的   用于检索公司的用例   宾语。例如,有手段   员工的场景太多了   使用Company对象检索。那里   是项目的场景较少   使用Company对象检索。所以,   在这些之后,您可以删除   公司对象和项目列表   从项目中多对一   对象(手动检索)。所以,   分析你的所有场景并制作   一些关系多对一。做其他   列表懒惰。