Откат CMT: как откатить транзакцию - PullRequest
0 голосов
/ 16 января 2012

Следующий код не помогает при откате, даже если я выбрасываю исключение нулевого указателя в методе update (). Каждый раз, когда я запускаю код, он вставляет значения в базу данных. Пожалуйста, помогите мне, как я могу откатить транзакцию, если нулевой указатель брошен в методе update (). Я что-то упустил в коде?

@TransactionManagement(value = TransactionManagementType.CONTAINER)
public class Bean implements RemoteIF {

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void insertIntoDb() {

        insert();
        update();


    }


    private Integer update() {
val=0;      
try {
            Connection con = DbConn.getConnection();
            Statement st = con.createStatement();
            val1 = st.executeUpdate("INSERT INTO tab VALUES('ab')");
            st.close();
            throw new NullPointerException();

        } catch (Exception e) {
            System.out.println(e);
        }

        return val;
    }

    private Integer insert() {
        int val = 0;

        try {

            Connection con = DbConn.getConnection();
            Statement st = con.createStatement();
            val = st.executeUpdate("INSERT INTO tab VALUES('bnm')");
            st.close();

        } catch (Exception e) {
            System.out.println(e);
        }

        return val;
    }
}

1 Ответ

0 голосов
/ 18 января 2012

Пара вещей, которые выдвигаются ко мне как подозрительные.

  • Нет @Stateless, @Stateful или @Singleton аннотация в классе Bean.Если вы не объявили bean-компонент в файле ejb-jar.xml, он не будет распознан как EJB.Обязательно дважды проверьте это.

  • DbConn.getConnection() выглядит подозрительно, как будто вы пытаетесь управлять соединениями с базой данных самостоятельно.Если у вас есть код, который использует DriverManager или new FooDataSource(), то это определенно является проблемой.Если вы хотите, чтобы управление транзакциями работало, вы должны получить все ресурсы из контейнера через

    • Инъекцию через поле @Resource DataSource datasource в классе EJB
    • Поиск JNDI java:comp/env/yourDataSourceгде yourDataSource - это имя источника данных, который вы настроили в ejb-jar.xml или объявили в классе компонента с помощью @Resource(type=DataSource.class, name="youDataSource") - эта аннотация идет на самом классе, а не на методе или поле.

См. Также эти ответы для некоторого понимания того, как работает управление транзакциями:

...