Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对聚合对象建模的正确方法是什么?_Java_Oop_Object Oriented Analysis - Fatal编程技术网

Java 对聚合对象建模的正确方法是什么?

Java 对聚合对象建模的正确方法是什么?,java,oop,object-oriented-analysis,Java,Oop,Object Oriented Analysis,我有两个域实体:Employee和Team。正如您所猜测的,团队有0…*Employees。对它们进行建模的正确方法是什么 备选案文1: class Team{ List<Employee> members; } 这个选项不会加载太多不必要的Employees,但从建模的角度来看,可能(我不确定)不是一个好的设计 备选案文3: class Team{} class Employee{ Team team; } 在此选项中,我可以通过员工的属性查询团队的员工s。但我认为(

我有两个域实体:
Employee
Team
。正如您所猜测的,团队有0…*
Employee
s。对它们进行建模的正确方法是什么

备选案文1:

class Team{
  List<Employee> members;
}
这个选项不会加载太多不必要的
Employee
s,但从建模的角度来看,可能(我不确定)不是一个好的设计

备选案文3:

class Team{} 
class Employee{
  Team team;
}
在此选项中,我可以通过
员工
的属性查询
团队
员工
s。但我认为(我不确定)从建模的角度来看,
员工
不应该知道如何组织,而且
员工
是一个没有
团队
就可以生存的实体


伙计们,你们觉得怎么样?

第一个选择很简单&最好

class Team{
    List<Employee> members;
}
班级团队{
成员名单;
}
您可以在Hibernate或许多其他JPA实现中设置批处理大小,以便在确实需要提取员工时,每次提取10名员工。这需要很少的时间来获取,并且Hibernate在您需要之前不会获取集合

“ID集”没有帮助——它不提供团队成员的姓名,也不会在您确实需要时加快加载速度

一般规则是,在需要之前不要进行优化

但是如果你需要的话,你可以考虑两个备选方案:

  • 为团队成员和员工打开EH缓存或类似的二级缓存
  • 在团队中存储聚合的“团队成员名称”属性注意:这只能保证有限的最新性,并且必须被截断以避免溢出其最大列大小

  • 但是,作为一个“指示性的显示文本”,而不是一个权威性的价值,第二个选项会很好。

    < P>你必须考虑的事实是,你不应该在你的团队中有成员在逻辑上是平等的(或者你想要1000个“代理史米斯的克隆人为你的团队战斗:-”)。 最好像这样对关系建模:

    Set<Employee> members;
    
    集合成员;
    
    第一个,如果没有order和repeat元素,请使用
    set
    而不是
    list
    。Hibernate或其他JPA实现具有这种延迟加载功能,但它需要关系数据库。在非关系数据库的情况下,这种设计如何?不知道。您在问题中没有提到您的存储层,您仍然没有明确说明它是什么&您有或没有什么缓存/批处理获取功能。选项1)取决于缓存,选项2)与数据库和存储无关。
    Set<Employee> members;