2013-03-22 152 views
0

我有实体单位,员工,我想映射到员工单位列表。休眠实体映射

例如,SQL:

select e.* 
from wfm.WFM_EMPLOYEE e 
    join wfm.wfm_position2unit p2u on p2u.UNIT_POSITION_ID=e.unit_position_id 
    join wfm.WFM_POSITION p on p.POSITION_ID=p2u.POSITION_ID 
    join wfm.wfm_unit u on u.UNIT_ID=p2u.UNIT_ID 
where u.unit_id = 337 

现在我已经通过 '嵌套' @OneToMany注解访问员工:

单位:

@Entity 
@Table(name = "WFM_UNIT", schema = AppData.WFM_SCHEMA) 
public class Unit implements Serializable { 
    ... 
    @OneToMany(mappedBy = "unit", fetch = FetchType.EAGER) 
    private List<Position2unit> position2units; 
    ... 
} 

PositionToUnit:

@Entity 
@Table(name = "WFM_POSITION2UNIT", schema = AppData.WFM_SCHEMA) 
public class Position2unit implements Serializable { 
    ... 
    @ManyToOne(fetch = FetchType.LAZY, optional = true) 
    @JoinColumn(name = "POSITION_ID") 
    private Position position; 

    @ManyToOne(fetch = FetchType.LAZY, optional = true) 
    @JoinColumn(name = "UNIT_ID") 
    private Unit unit; 

    @OneToMany(mappedBy = "position2unit", fetch = FetchType.LAZY) 
    private List<Employee> employees; 
    ... 
} 

员工:

@Entity 
@Table(name = "WFM_EMPLOYEE", schema = AppData.WFM_SCHEMA) 
public class Employee implements Serializable { 
    ... 
    @NotFound(action = NotFoundAction.IGNORE) 
    @ManyToOne(fetch = FetchType.LAZY, optional = true) 
    @JoinColumn(name = "UNIT_POSITION_ID") 
    private Position2unit position2unit; 
    ... 
} 

回答

1

我认为迄今为止最容易的解决办法是添加一个方法单位:

Collection<Employee> getEmployees() { 
    final Collection<Employee> employees = new HashSet<Employee>(); 
    for (final Position2unit p2u : position2units) { 
    employees.addAll(p2u.employees); 
    } 
    return employees; 
} 

和完全忘掉映射。

+0

好的。有没有办法通过映射来做到这一点?谢谢。 – yagodkin 2013-03-25 05:12:54

+0

是的,当然有。但在我看来是没有多大意义的。因为实施它会使事情变得更加复杂。例如保持与其他关系同步。您需要为这些人实施生命周期方法。而如果你不映射,你将永远为每个单位找到合适的雇员。或者你为什么希望它被映射? (这里没有讽刺意味) – 2013-03-25 08:59:52

+0

雇员名单将仅用于显示数据,不会被操纵。 映射,我觉得更优雅。所以我只是很有趣,映射和方法之间没有原则性的区别。 – yagodkin 2013-03-25 12:34:22