1. Java / Говнокод #1885

    +73.7

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    public Object save(Object entity) {
            final EntityManager em = getEntityManager();
            try {
                final EntityTransaction et = em.getTransaction();
                try {
                    et.begin();
                    em.persist(entity);
                    et.commit();
                } finally {
                    if (et != null && et.isActive()) {
                        entity = null;
                        et.rollback();
                    }
                }
            } finally {
                if (em != null && em.isOpen()) {
                    em.close();
                }
            }
            return entity;
        }

    Простое и понятное управление транзакциями придумали трусы!
    А rollback в секции finally, и вложенные try-catch секции -- вообще модная сейчас фишка.

    Запостил: rh.mbox, 23 Сентября 2009

    Комментарии (8) RSS

    • А как можно переделать и чем rollback в finally так плох?
      Ответить
      • Хотя бы тем, что после комита он не имеет смысла.

        Ну обычно делают что-то вроде:
        public Object save(Object entity) {
        final EntityManager em = getEntityManager();
        final EntityTransaction transaction = em.getTransaction();
        try {
        transaction.begin();
        em.persist(entity);
        transaction.commit();
        } catch (RuntimeException e) {
        transaction.rollback();
        throw e;
        } finally {
        if (em.isOpen()) {
        em.close();
        }
        }
        return entity;
        }
        Ответить
        • Хотя нет, обычно используют декларативные транзакции. Программные здесь тоже от большого ума появились.
          Ответить
        • До commit дело может и не дойти, а блок finally отработается все равно и тогда будет rollback.
          Ответить
          • И там вроде есть проверка на активность транзакции, не знаю, правда, что показывает метод isActive() до и после commit
            Ответить
            • Короче, секцию catch придумали трусы. Челябинские мужики настолько суровы, что используют сразу finally.
              Ответить
              • Иногда код может быть написан таким образом, что rollback нужно сделать не только при возникновении исключения, но и, скажем, при выполнении какого-нибудь условия. Тогда блок finally будет как нельзя кстати.
                Ответить
                • это типичный говнокод, проверять isActive если произошел ексепшен, скорее всего это вызовет еще один эксепшен. похоже чувак слышал звон да не знает где он.
                  Ответить

    Добавить комментарий