技术: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列表或仅支持完全成熟的对象。
谢谢
答案 0 :(得分:2)
另一种方法可以是使用List branchIdList,列出projectIdList 是对象的ID列表。
在此之前请仔细考虑。使用ORM的全部意义在于DB中通过外键相互链接的行可以表示为通过常规Java引用和集合链接的对象。通过使用您概述的方案,您将失去使用Hibernate的大部分优势。
推荐的方法是使用延迟加载。
最好使用包括如下因素 在记忆方面的表现主要是, 程序员的灵活性(第一个 是一个灵活的程序员和 第二个使用更少的内存。)
恕我直言,你获得的记忆,如果有的话,不值得程序员的痛苦。
答案 1 :(得分:1)
我想,你必须先看到你的 用于检索公司的用例 宾语。例如,有手段 员工的场景太多了 使用Company对象检索。那里 是项目的场景较少 使用Company对象检索。所以, 在这些之后,您可以删除 公司对象和项目列表 从项目中多对一 对象(手动检索)。所以, 分析你的所有场景并制作 一些关系多对一。做其他 列表懒惰。