@Override
  public void addRollenTypToEinheit(RollenTyp rollenTyp, Einheit einheit)
      throws RollenTypException {
    // check rolenTyp
    if (rollenTyp == null) {
      throw new RollenTypException("rollenTyp == null");
    }
    JpaRollenTyp jpaRollenTyp = jpaRollenTyp4oid(rollenTyp.getOid());
    if (jpaRollenTyp == null) {
      throw new RollenTypException("unknown rollenTyp: " + rollenTyp.getOid());
    }

    // check einheit
    try {
      einheit = einheitApi.einheit4oid(einheit.getOid());
    } catch (EinheitException e) {
      throw new RollenTypException("einheit == null");
    }

    // check duplicate
    JpaRollenTypZuordnung jpaRollenTypZuordnung =
        jpaRollenTypZuordnung4RollenTypAndEinheit(rollenTyp.getOid(), einheit.getOid());

    // no duplicate -> insert
    if (jpaRollenTypZuordnung == null) {
      jpaRollenTypZuordnung = new JpaRollenTypZuordnung();
      jpaRollenTypZuordnung.setOid(UUID.randomUUID().toString());
      jpaRollenTypZuordnung.setRollenTypOid(rollenTyp.getOid());
      jpaRollenTypZuordnung.setEinheitOid(einheit.getOid());
      em.persist(jpaRollenTypZuordnung);
    }
  }
  @Override
  public List<Einheit> einheitList4oberEinheit(Einheit oberEinheit) throws EinheitException {
    // check params
    if (oberEinheit == null) {
      throw new EinheitException("oberEinheit == null");
    }
    String oberEinheitOid = oberEinheit.getOid();

    // execute query
    TypedQuery<JpaEinheit> query =
        em.createQuery(
            "select e from JpaEinheit e where e.oberEinheitOid = :oberEinheitOid",
            JpaEinheit.class);

    // return result
    return query
        .setParameter("oberEinheitOid", oberEinheitOid)
        .getResultList()
        .stream()
        .map(JpaEinheit::toEinheit)
        .collect(Collectors.toList());
  }
  @Override
  public void einheitLoeschen(Einheit einheit) throws EinheitException {
    // check params
    if (einheit == null) {
      throw new EinheitException("einheit == null");
    }

    // check oid
    String oid = einheit.getOid();
    if (oid == null) {
      throw new EinheitException("oid == null");
    }

    // get entity
    JpaEinheit jpaEinheit = jpaeinheit4oid(oid);
    if (jpaEinheit == null) {
      throw new EinheitException("oid not found: " + oid);
    }

    // delete
    em.remove(jpaEinheit);
  }
  @Override
  public Einheit einheitErzeugen(Einheit einheit) throws EinheitException {
    // check params
    if (einheit == null) {
      throw new EinheitException("einheit == null");
    }

    // set oid
    if (einheit.getOid() == null) {
      einheit.setOid(UUID.randomUUID().toString());
    }
    if (einheit.getCreated() == null) {
      einheit.setCreated(new Date());
    }

    // persist
    em.persist(JpaEinheit.fromEinheit(einheit));

    // notify listeners
    listerApi.einheitAngelegt(einheit);

    // return einheit
    return einheit;
  }