Как использовать навигатор вместо window.webkitStorageInfo HTML5 API файловой системы?

Это старый вопрос, но у меня была аналогичная проблема, и я решил добавить к этой теме. Мне нужно было добавить журнал к существующему журналу журнала аудита StatelessSession. Существующая реализация использовала StatelessSession, поскольку поведение кэширования стандартной реализации сеанса было ненужным накладными расходами и , и мы не хотели, чтобы наши слушатели спящего режима запускали запись журнала аудита. Эта реализация заключалась в достижении максимальной производительности записи без каких-либо взаимодействий.

Однако для нового типа журнала необходимо использовать тип поведения insert-else-update, где мы намерены обновлять существующие записи журнала с временем транзакции в качестве типа «пометки». В StatelessSession saveOrUpdate () не предлагается, поэтому нам нужно было выполнить обновление insert-else вручную.

В свете этих требований:

Вы можете использовать поведение mysql «insert ... on duplicate key update» через пользовательскую sql-insert для постоянный объект спящего режима. Вы можете определить произвольное предложение sql-insert либо через аннотацию (как в приведенном выше ответе), либо через объект sql-insert, сопоставление hibernate xml, например:



    
        
        
        
    
    
    
    
    

Оригинальный плакат спрашивает о MySQL конкретно , Когда я реализовал поведение insert-else-update с помощью mysql, я получал исключения, когда «путь обновления» sql был выведен. В частности, mysql сообщал, что 2 строки были изменены, когда обновлялась только одна строка (якобы из-за того, что существующая строка является удаленной, а новая строка вставлена). См. эту проблему для более подробной информации об этой конкретной функции.

Итак, когда обновление возвратило 2x количество строк, затронутых в спящий режим, hibernate выбрасывал исключение BatchedTooManyRowsAffectedException, откат транзакции , и пропагандировать исключение. Даже если вы должны поймать исключение и обработать его, транзакция уже была отклонена этим пунктом.

После некоторого копания я обнаружил, что это проблема с сущностью, которую использует спящий режим. В моем случае hibernate использовал SingleTableEntityPersister, который определяет Ожидание, что количество обновленных строк должно соответствовать количеству строк, определенных в пакетной операции.

Окончательная настройка, необходимая для работы этого поведения, заключалась в определении пользовательский persister (как показано в приведенном выше сопоставлении xml). В этом случае все, что нам нужно было сделать, это расширить SingleTableEntityPersister и «переопределить» вставку Expectation. Например. Я просто применил этот статический класс к объекту persistence и определил его как пользовательский persister в сопоставлении спящего режима:

public static class UpsertEntityPersister extends SingleTableEntityPersister {

    public UpsertEntityPersister(PersistentClass arg0, EntityRegionAccessStrategy arg1, SessionFactoryImplementor arg2, Mapping arg3) throws HibernateException {
        super(arg0, arg1, arg2, arg3);
        this.insertResultCheckStyles[0] = ExecuteUpdateResultCheckStyle.NONE;
    }

}

Чтобы найти это, потребовалось довольно много времени, пробираясь через спящий код, - я не смог найти любые темы в сети с решением этого.

23
задан Community 23 May 2017 в 12:10
поделиться