Ответы пользователя по тегу MySQL
  • Откуда ошибка "Column 'id' cannot be null" в Hibernate?

    @bobzer
    Java EE Developer
    Проверьте настройки дочерних сущностей. Мысль примерно такая - генерация ID настроена везде, но Hibernate не всегда "знает" о том, что в конкретном случае надо использовать эту генерацию. Например, вы сохраняете нового пользователя - сохранение проходит. Затем вы добавляете роль в список ролей пользователя, сохраняете - и возникает ошибка потому, что в маппинге списка ролей не указано CascadeType.PERSIST или CascadeType.ALL. Если вы не "сказали" Hibernate-у сохранять дочерние сущности, но добавили новый объект в список, то не будет попытки создать добавленный объект в БД. Если дело именно в дочерних объектах, то этим может объясняться и непостоянство возникновения ошибки: не добавляли дочерних объектов - всё ОК, добавили - ошибка.

    Проверьте все связи @OneToMany.
    Ответ написан
  • Как настроить правильную кодировку в связке MySQL + Tomcat?

    @bobzer
    Java EE Developer
    Попытайтесь указать кодировку в url соединения в context.xml следующим образом:
    url="jdbc:mysql://ip:3306/name?useUnicode=true&characterEncoding=UTF-8"
    Ответ написан
  • Запрос Mysql из двух взаимозависимых таблиц

    @bobzer
    Java EE Developer
    Если вам нужны именно пользователи, то основную таблицу запроса удобнее будет взять users:

    select distinct us.* from users us
    inner join comments com on com.user_id = us.user_id
    order by com.date
    Ответ написан
    2 комментария
  • Как сделать чтобы при вставке значения, первое из дублирующихся значений вставлялось, а все последующие обновлялись?

    @bobzer
    Java EE Developer
    1. Можно попробовать триггеры с вашей специфической логикой: создаёте триггер на insert/update в таблицу, а внутри него крутите любую бизнес-логику. Если СУБД развернута на более-менее приличных серверах, то 1-10 млн. операций в сутки пройдет без перенапряжения.

    2. Делать работу в коде - открыли транзакцию, и на вашем ЯП читаете/вставляете/обновляете записи в БД, по окончании завершаете транзакцию. Нагрузка чуть больше, чем в п.п. 1, но при грамотном "общении" с СУБД тоже не так уж и велика.

    3. Разбираетесь, почему у вас дубликаты в БД, читаете мануалы по нормализации данных в СУБД, просите проанализировать структуру спецов. После один раз напрягаетесь чтобы сделать нормальную структуру БД, зато потом работаете с БД "правильно" а не путем применения специфических функций (выходящих за рамки стандарта SQL 2008 (обычно хватает стандарта 92-го года))...

    Вот триггер:
    CREATE TRIGGER wc_terms_unique_slug
    BEFORE INSERT ON wc_terms FOR EACH ROW
    BEGIN
    declare
    countDoubles int;
    
    select count(*) into @countDoubles from wc_terms
        where slug = NEW.slug or slug REGEXP CONCAT('(^', NEW.slug, ')([\-])([0-9]+)$');
    if(@countDoubles > 0) then
        SET NEW.slug = CONCAT_WS('-', NEW.slug, @countDoubles + 1);
    end if;
    
    END;

    После его создания делаете обычные insert-ы (без ON DUPLICATE KEY)
    Ответ написан
    6 комментариев
  • Опытом работы с распределенными транзакциями и MySQL?

    @bobzer
    Java EE Developer
    1. Странно, а почему автор не интересуется проблемами с XA у его реализации JMS? Вы ведь хотите объединить в одну транзакцию двух провайдеров: СУБД и JMS. Причем исторически СУБД по части транзакций являются более продвинутыми, это одна из их основных функций, в то время как у сервисов доставки сообщений основной уклон немного в другую сторону. Мне кажется, что возможными проблемами с XA у вашего JMS-провайдера следовало бы озаботиться в первую очередь.

    2. Из личного опыта: как-то сталкивался с похожей ситуацией, появилось желание объединить в одну XA-транзакцию JMS (IBM WebSphere MQ) и СУБД (Oracle). Не получилось, лезли какие-то глюки. Это было очень давно, возможно я не разобрался до конца, возможно технологии XA тогда были еще сырые, не важно. Я тогда пошел другим путем. В проекте использовался ORM (Hibernate), соответственно все обращения к СУБД шли через эту прослойку. Так вот, я подумал, что раз и так все делается через Hibernate, то почему бы не посмотреть что там есть по части объединения различных ресурсов в одну транзакцию. И оказалось, что таки есть. У org.hibernate.Transaction есть метод registerSynchronization, который принимает объект, реализующий методы beforeCompletion и afterCompletion. В методе beforeCompletion я и реализовал завершение транзакции JMS. Конечно, такой подход можно считать менее надежным, чем XA-технологии, но абсолютно надежных транзакций не существует. Добавлю лишь, что система высоконагруженная (порядка миллиона транзакций в сутки, из них треть с использованием вышеописанной связки СУБД и JMS, и за 6 лет промышленной эксплуатации вопросов/проблем связанных с именно такой реализацией не было. Так что, на мой взгляд, достойный вариант, не имеющий глюков (по крайней мере в одной системе за 6 лет).
    Ответ написан