Может ли Hibernate работать с синтаксисом MySQL «ON DUPLICATE KEY UPDATE»?

Это старый вопрос, но у меня object-relational-mapping была аналогичная проблема, и mysql-server я решил добавить в эту тему. Мне hibernate нужно было добавить журнал mysql-query в существующий модуль записи hibernate журнала аудита StatelessSession. Существующая mysqlclient реализация использовала StatelessSession, потому jdk что поведение кэширования hibernate стандартной реализации сеанса jdk было ненужными накладными jre расходами и мы не хотели, чтобы jre наши прослушиватели гибернации mysql-query запускались для записи журнала j2se аудита. Эта реализация была j2se направлена ​​на достижение mysqldump максимально возможной производительности mysqld записи без каких-либо взаимодействий.

Однако mysql-server новый тип журнала должен my-sql использовать поведение типа jre "вставка-другое-обновление", при hibernate котором мы намерены обновить jre существующие записи журнала jre с указанием времени транзакции javax в качестве типа поведения openjdk "пометки". В StatelessSession mysqlclient функция saveOrUpdate() не j2se предлагается, поэтому нам mysql нужно было реализовать insert-else-update orm вручную.

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

Вы openjdk можете использовать поведение mysql openjdk «вставить ... при обновлении orm дублирующего ключа» с помощью my-sql настраиваемой sql-вставки jre для постоянного объекта гибернации. Вы jre можете определить настраиваемое j2se предложение sql-insert либо java с помощью аннотации (как mysql-query в ответе выше), либо с помощью java объекта sql-insert с отображением my-sql xml hibernate, например:



    
        
        
        
    
    
    
    
    

На my-sql оригинальном плакате конкретно mysql-query спрашивается о MySQL. Когда object-relational-mapping я реализовал поведение insert-else-update javax с mysql, я получал исключения, когда openjdk выполнялся «путь обновления» sql. В hibernate частности, mysql сообщал, что mysqldump 2 строки были изменены, когда openjdk была обновлена ​​только 1 javax строка (якобы потому, что j2se существующая строка удаляется, а j2se новая строка вставляется). См. this issue для jdk получения дополнительных mysqldump сведений об этой конкретной .java функции.

Таким образом, когда java обновление вернуло в два hibernate раза больше строк, затронутых jdk переходом в спящий режим, спящий mysql режим генерировал исключение my-sql BatchedTooManyRowsAffectedException, откатывал openjdk транзакцию и распространял mysql-server исключение. Даже если вы mysql перехватили исключение и mysqlclient обработали его, к этому моменту javax транзакция уже была откатана.

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

Последней настройкой, необходимой mysqlclient для того, чтобы это поведение orm работало, было определение mysql настраиваемого персистера java (как показано в приведенном javax выше сопоставлении xml). В jdk этом случае все, что нам j2se нужно было сделать, это расширить openjdk SingleTableEntityPersister mysql-query и «переопределить» вставку mysqldump Expectation. Например. Я object-relational-mapping просто прикрепил этот статический mysql-query класс к объекту постоянства orm и определил его как настраиваемый javax постоянный объект в отображении orm гибернации:

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;
    }

}

Чтобы найти это, пришлось hibernate долго копаться в коде гибернации openjdk - я не смог найти в сети object-relational-mapping ни одной темы с решением mysqlclient этой проблемы.

java

mysql

hibernate

orm

2022-10-21T22:16:13+00:00
Вопросы с похожей тематикой, как у вопроса:

Может ли Hibernate работать с синтаксисом MySQL «ON DUPLICATE KEY UPDATE»?