2013-03-22 246 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