Вы можете проверить, управляется ли сущность, вызвав
boolean isManaged = entityManager.contains( t );
Если true, просто позвоните
entityManager.remove(t);
, иначе ваш второй подход выглядит лучше, так как слияние может привести к большей активности БД из-занетерпеливая загрузка (если настроено).Javadoc на getReference говорит: «Получить экземпляр, состояние которого может быть отложено извлечено. Если запрошенный экземпляр не существует в базе данных, выдает исключение EntityNotFoundException при первом обращении к состоянию экземпляра. (Среда выполнения поставщика постоянстваразрешено выбрасывать EntityNotFoundException при вызове getReference (java.lang.Class, java.lang.Object).) Приложение не должно ожидать, что состояние экземпляра будет доступно после отсоединения, если оно не было доступно приложению, пока менеджер сущностей былopen. "
Короче говоря, сущностью нужно управлять, поэтому я бы предложил:
em.remove(em.contains(r) ? r : em.merge(r));