java - ارتكاب تغييرات في محاولة الصيد داخلTransactional



spring hibernate (1)

النظر في لدي طريقة القيام ببعض الأشياء وتسجيل آلية في نمط نمط أكتيفريكورد:

@Transactional
public void doSmt() {
    try {
        someOperation(); // can throw exception
        Logger.logIntoDb(); // if everything is OK
    } catch {Exception e} {
        Logger.logIntoDbWithException(e.getMessage()); // log error into db

        throw new MyCustomException(e);
    }
}

public static void logIntoDbWithException(String message) {
    final LogEntry logEntry = new LogEntry();
    logEntry.setDate(new Date());
    logEntry.setMessage(message);
    logEntry.persist();
}

أريد أن أظل رسالة خطأ في حالة الفشل، ولكن إذا كنت إعادة إسقاط استثناء في الصفقة البند الصيد سيتم تراجع و بلدي لوجنتري لن تستمر. الطريقة الوحيدة التي أرى هو استدعاء flush() يدويا flush() بعد persist() .

هل هناك حل أكثر نظافة لأداء هذا؟

شكر.

UPD:

منذ لدي طريقة ثابتة التي تؤدي استمرار أنا بحاجة إلى تطبيق التالية الإختراق إلى الإجابة المقبولة:

public static void logIntoDbWithException(String message) {
    new Runnable() {
        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public void run() {
            final LogEntry logEntry = new LogEntry();
            logEntry.setDate(new Date());
            logEntry.setMessage(message);
            logEntry.persist();
        }
    }.run();
}

أولا، لن يقوم دافق () بالقيام بأي خير: فلوش () لا يرتكب أي شيء، كما أنك تقوم بتسجيل الخطأ في نفس المعاملة، سيتم إرجاع الإدراج.

لذلك تحتاج إلى بدء معاملة "متداخلة" جديدة لتسجيل الخطأ.

public class A {

    @Autowired
    private B b;

    @Transactional
    public void doSmt() {
        try {
            someOperation(); // can throw exception
            b.logIntoDb(); // if everything is OK
        } catch {Exception e} {
            b.logIntoDbWithException(e.getMessage()); // log error into db

            throw new MyCustomException(e);
        }
    }
}

public class B{

    //outer transaction is still active
    public  void logIntoDb(String message) {
        final LogEntry logEntry = new LogEntry();
        logEntry.setDate(new Date());
        logEntry.setMessage(message);
        logEntry.persist();
    }

    // 'outer' transaction will be suspended until this method completes
    // this new transaction will commit/rollback independently of the outer transaction
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public  void logIntoDbWithException(String message) {
        final LogEntry logEntry = new LogEntry();
        logEntry.setDate(new Date());
        logEntry.setMessage(message);
        logEntry.persist();
    }
}