0

Unit、Employee というエンティティがあり、Unit の Employee のリストにマッピングしたいと考えています。

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;
    ...
}

単位への位置:

@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;
    ...
}
4

1 に答える 1

1

最も簡単な解決策は、Unit にメソッドを追加することだと思います。

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

マッピングを完全に忘れます。

于 2013-03-22T13:50:31.930 に答える