@Override
  public void addRollenTypToEinheitArt(RollenTyp rollenTyp, EinheitArt einheitArt)
      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 einheitArt
    if (einheitArt == null) {
      throw new RollenTypException("einheitArt == null");
    }

    // check duplicate
    JpaRollenTypZuordnung jpaRollenTypZuordnung =
        jpaRollenTypZuordnung4RollenTypAndEinheitArt(rollenTyp.getOid(), einheitArt);

    // no duplicate -> insert
    if (jpaRollenTypZuordnung == null) {
      jpaRollenTypZuordnung = new JpaRollenTypZuordnung();
      jpaRollenTypZuordnung.setOid(UUID.randomUUID().toString());
      jpaRollenTypZuordnung.setRollenTypOid(rollenTyp.getOid());
      jpaRollenTypZuordnung.setEinheitArt(einheitArt);
      em.persist(jpaRollenTypZuordnung);
    }
  }
  @Override
  public void removeRollenTypFromEinheitArt(RollenTyp rollenTyp, EinheitArt einheitArt)
      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 einheitArt
    if (einheitArt == null) {
      throw new RollenTypException("einheitArt == null");
    }

    // check existence
    JpaRollenTypZuordnung jpaRollenTypZuordnung =
        jpaRollenTypZuordnung4RollenTypAndEinheitArt(rollenTyp.getOid(), einheitArt);
    if (jpaRollenTypZuordnung == null) {
      throw new RollenTypException(
          "RollenTypZuordnung does not exist: " + rollenTyp.getOid() + ", " + einheitArt);
    }

    // remove from DB
    em.remove(jpaRollenTypZuordnung);
  }
  @Override
  public void rollenTypLoeschen(RollenTyp rollenTyp) throws RollenTypException {
    // check params
    if (rollenTyp == null) {
      throw new RollenTypException("rollenTyp == null");
    }

    // lookup in DB
    JpaRollenTyp jpaRollenTyp = jpaRollenTyp4oid(rollenTyp.getOid());

    // delete from DB
    em.remove(jpaRollenTyp);

    // notify listener
    rollenTypListenerApi.rollenTypGeloescht(rollenTyp);
  }
  @Override
  public RollenTyp rollenTypErzeugen(RollenTyp rollenTyp) throws RollenTypException {
    // check params
    if (rollenTyp == null) {
      throw new RollenTypException("rollenTyp == null");
    }

    // set oid
    rollenTyp.setOid(UUID.randomUUID().toString());

    // persist
    JpaRollenTyp jpaRollenTyp = JpaRollenTyp.fromRollenTyp(rollenTyp);
    em.persist(jpaRollenTyp);

    // notify listeners
    rollenTypListenerApi.rollenTypAngelegt(rollenTyp);

    // return result
    return rollenTyp;
  }