powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / org.hibernate.MappingException: Java Hibernate
25 сообщений из 64, страница 2 из 3
org.hibernate.MappingException: Java Hibernate
    #38735481
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo3. Потоки, которые лязят в базу раз в несколько секунд каждый раз открывают и закрывают соединение.
вполне возможно обойтись без потоков......?
Что они конкретно делают и где стартуют?
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735489
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemo
Код: java
1.
2.
3.
4.
5.
6.
Session session = HibernateUtil.createSessionFactory().openSession();
[SRC java]            session.beginTransaction();

            session.save(payment);
            session.getTransaction().commit();
            session.close();


[/SRC]
слона надо есть по частям (с)
- вставь после старта транзакции процедуру
payment = GetMyPayment();
- вынеси в неё всю лабуду.
- убери из кода все потоки и доп обработку таблиц.
- запусти нагрузочно на 30 мин просто вставку в БД
....
работает?

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry;

    public static SessionFactory createSessionFactory() {
        Configuration configuration = new Configuration();
        configuration.configure();
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
                configuration.getProperties()).build();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    }
}



Я решил, что метод createSessionFactory можно вызвать и один раз и сделать вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class HibernateUtil {
    private static SessionFactory sessionFactory = null;
    private static ServiceRegistry serviceRegistry;

    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null)
            createSessionFactory();
        return sessionFactory;
    }

    private static void createSessionFactory() {
        Configuration configuration = new Configuration();
        configuration.configure();
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
                configuration.getProperties()).build();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    }
}



Запустил стресс-тест, пока что все норм. Часик посмотрю, что будет
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735510
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
раз уж класс утилитный, то можно побольше кишков туда спрятать
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
   Session session = HibernateUtil.beginTransaction(); 		
   try {
			Main u = new Main();
			u.setPassword("abc123");
			session.saveOrUpdate(u);
		} finally {
			HibernateUtil.commitTransaction();
		}


Код: java
1.
2.
3.
4.
5.
6.
7.
  // class HibernateUtil {
	public static Session beginTransaction() {
		Session hibernateSession;
		hibernateSession = HibernateUtil.getSession();
		hibernateSession.beginTransaction();
		return hibernateSession;
	}


- try везде ставь
- сдаётся мне, что в коде выше можно одну сессию хибера на весь блок while "протянуть" imho
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735559
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть еще один момент, который я упустил, когда переводил всю работу с БД на Hibernate.

Код: java
1.
2.
3.
4.
            session.beginTransaction();

            session.save(payment);
            session.getTransaction().commit();



Вот тут мне надо бы узнать id новой записи и Timestamp.

Метод save класса Session что-то возвращает, вопрос - можно ли из этого что-то вытащить хотя бы id
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735607
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoВот такое у меня в doPost сервлета, куда посылается несколько сотен запросов в секунду. Без Hibernate все эти запросы успевали обрабатываться.Без ORM вы работали с подключением?
Лично я ORM не знаю, но, тем не менее, не уверен, что "ORM session" == "JDBC connection"А здесь висяк уже после 15
Код: java
1.
2.
3.
4.
5.
6.
            Session session = HibernateUtil.createSessionFactory().openSession();
            session.beginTransaction();

            session.save(payment);
            session.getTransaction().commit();
            session.close();

Давайте переведём это всё на SQL. ORM, как я уже отмечал, мне неизвестен, но с кочки зрения эрудиции и банальной логики, должно быть:
Код: sql
1.
2.
3.
4.
begin transaction;
insert into ...;
commit;
end transaction;

"По моему так" (ц) Винни-Пух
Возникает вопрос - для чего явно стартовать транзакцию, если достаточно разрешить autocommit и "просто вставлять"?
Соответственно, вместо гадания на кофейной гуще путём тасования методов единственного класса, имеет смысл изучить документацию Hibernate на предмет "просто вставки".

P.S. Спросив у гугля Hibernate insert получил на третьей позиции Chapter 15. Batch processing , которая начинается с рассмотрения случая очень похожего на ваш.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735804
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geronemo,
лучше конечно сначала хоть немного разобраться. От такого перехода с jdbc на hibernate будет только вред, сплошные глюки и тормоза.
Вот только несколько фактов из приведенного выше кода:
- configuration.configure() действительно нужно делать пореже, лучше всего, 1 раз, так как тут работа с ресурсами, достаточно долгая.
- configuration.buildSessionFactory() надо делать еще реже, тут идет составляение словаря, сопоставление меппингов с классами и т.п. Эта операция очень долгая
- следует научиться работать с транзакциями, если хочется коммитить на каждый чих, то лучше просто воспользоваться автокоммитом. Лучше, конечно, использовать 1 транзакцию на метод, а еще лучше - на бизнес-транзакцию. При работе с транзакциями в обязательно порядке использовать try finally, учесть, что возможны эксепшены, а значит, нужны и роллбеки. Наконец, отдать управление транзакциями серверу/менеджеру
- понять, что сессия хибернейт - это не просто аналог коннекта, а также и локальный кеш данных, позволяющий при правильном использовании работать с базой даже быстрее чем на чистом jdbc. Точно так же, как и с транзакциями, не надо открывать и закрывать сессию на каждый чих
- разобраться с коннектами. Что там в конфигурации? Открывать "физический" коннект на каждый чих тоже большая роскошь. Читать про пулы и их конфигурирование
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735820
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoВот тут мне надо бы узнать id новой записи и Timestamp.
Код: java
1.
2.
        session.save(myclass);//сохранили, наш id сгенерировался и сразу заполнился
        myclass = (MyСlass) session.get(MyСlass.class, myclass.getId());
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736233
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123GeronemoВот тут мне надо бы узнать id новой записи и Timestamp.
Код: java
1.
2.
        session.save(myclass);//сохранили, наш id сгенерировался и сразу заполнился
        myclass = (MyСlass) session.get(MyСlass.class, myclass.getId());



Спасибо, это работает. Но есть один очень грустный момент. При перезапуске сервера (Tomcat 7.0)
session.save(myclass);
начинает генерить id сначала. А мне нужно, чтобы БД как-то запоминало последний id. хм... А я в другом потоке вытаскиваю все записи из этой таблицы (BufferPaymentTable) и помещаю в другую (OperationPaymentTable). Т. е. обнаружилась сложность, как мне писать id так, чтобы при перезапуске сервера нумерация продолжалась с того момента, где закончилась в предыдущий раз.
Вариант решения.
Каждый раз при инициализации сервера я могу слазить в БД, в эту другую таблицу (OperationPaymentTable) и посмотреть максимальный id там. Потом как-то сообщить БД, чтобы session.save(myclass); продолжало с id+1 (а оно пишет в BufferPaymentTable).

Или же есть какой-то способ попроще.

Кстати, все еще открыт вопрос, про то, как мне получать текущеее время записи полученных данных.
Потому как myclass = (MyСlass) session.get(MyСlass.class, myclass.getId()); получает id, а мне еще нужно и currenttime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP. Неужели делать еще один запрос в БД, т. е. всего их будет 3 ? (1 - запись, 2-й прочитали id, 3-й по этому id прочитали currenttime)
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736238
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вопрос. Посоветуйте книгу/руководство по SQL. Ищу сейчас работу java-программера, везде где был надо знать SQL на более-менее приличном уровне (а не моем - сделать insert, update и delete).
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736254
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
почему сразу при приходе объекта его не записать и не обработать? Зачем 5 сек?
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736263
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemoначинает генерить id сначала
))) прикольно.
Измени маппинг Id
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736268
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemoтекущеее время записи полученных данных.
myclass.geXXXXXXX())
не работает?
....
Если обрабатывать сразу, то время вообще не нужно.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736771
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemo,
почему сразу при приходе объекта его не записать и не обработать? Зачем 5 сек?

Таковы требования к системе. Вкратце.
Есть около несколько десятеов тыс. клиентов, которые формируют в среднем несколько сотен запросов в секунду. Обработка каждого запроса зависит от внешних серверов, которые нам неподвластны. Поэтому все входящие запросы пишутся в буферную таблицу. Тут наше дело просто зарегистрировать запрос. Вы обращали внимание, что в сервисах приема платежей, в интернет-банках, когда вы отправляете запрос на платеж, то обычно вам дается ответ ввиде "Платеж принят на обработку id=xxxxxxx", а не ввиде "ваш платеж успешно исполнен". Я пишу именно такую систему. Сначала все запросы становятся в очередь (помещаются в буферную таблицу). Далее другое приложение (возможно установленное на другом физ. сервере) забирает порциями эти запросы в другую таблицу, передает данные обработчику, который связывается с удаленным сервером некого оператора услуг, получает ответ и пишет его в базу.
Давайте тему этих взаимодействий не будем обсуждать. Это ТЗ. Мое дело реализовать это наиболее быстрым и надежным способом.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736775
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoДавайте тему этих взаимодействий не будем обсуждать. Это ТЗ. Мое дело реализовать это наиболее быстрым и надежным способом.
А мы хотим обсуждать. Может мы тебе JMS присоветуем. А тебя за инициативу нагрядят. Или побъют.
Впрочем это неважно. Главное чтоб форум был интересен а не решал чьи-то меркантильные задачки.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736789
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonGeronemoДавайте тему этих взаимодействий не будем обсуждать. Это ТЗ. Мое дело реализовать это наиболее быстрым и надежным способом.
А мы хотим обсуждать. Может мы тебе JMS присоветуем. А тебя за инициативу нагрядят. Или побъют.
Впрочем это неважно. Главное чтоб форум был интересен а не решал чьи-то меркантильные задачки.

Ну можно и пообсуждать, я непротив выслушать интересные мысли. Почему у меня организовано именно так, я изложил выше. Если каждому входящему запросу (а их несколько сотен) дать ресурсы на немедленную полную обработку, то все повиснет из-за того,что они будут ломиться по одному на связь со внешними серверами. А так мы можем их как-то выстроить в очередь, некоторые запросы скомпоновать и передать в одном пакете несколько запросов.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736790
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonнагрядят. Или побъют.Впрочем это неважно. ))
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736793
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemoвыстроить в очередь
очередь какая то странная - "while"
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736815
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemoвыстроить в очередь
очередь какая то странная - "while"

Задумывалась как временная конструкция. Но, очень хорошо работает, т. ч. надо будет еще голову поломать, чем это заменить.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736851
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemoтекущеее время записи полученных данных.
myclass.geXXXXXXX())
не работает?
....
Если обрабатывать сразу, то время вообще не нужно.

Там дело не в маппинге, а втом, что эта таблица постоянно очищается. И если перезапустить Сервер, то движок Hibernate забудет, что в этой таблице когда-то присутствовали данные. Если честно, то, когда у меня работа с БД была через jdbc, тогда вероятно была та же самая ошибка, но я ее не заметил.

В общем, я х. з., нужен совет по этой теме.
Сейчас у меня в маппинг-файле написано такое

Код: xml
1.
2.
3.
4.
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>



Я сделал небольшой метод в классе Hibernate
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public static int getNextId() {

        Session session = null;
        int id = 1;

        try {

            session = getSessionFactory().openSession();
            Query query = session.createSQLQuery("select max(paymentid) from OperationPaymentTable");
            List<Integer> list = query.list();
            id = list.get(0) + 1;

            Logger.getLogger().write("ID = " +id);

        } catch (Exception ex) {
            Logger.getLogger().write("HibernateUtil.getNextId, ex = " + ex.toString());
        } finally {
            session.close();
        }
        
        return id;
    }


И он работает. В процессе инициализации сервера я вызываю эту функцию.
Только вот остался вопрос, как заставить BufferPaymentTable назначать id не с 1, а с этого полученного мною значения.
Пробовал
payment.setId(startId);
session.save(payment);
Но не работает, все равно id пишет с еденицы
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736860
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
что за бред?
Если инкремент не твой доморощенный, а самой СУБД, то она его никогда не забудет)).
Даже оракл в своей 12-ой версии всё таки ввел такое поле)
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736878
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemo,
что за бред?
Если инкремент не твой доморощенный, а самой СУБД, то она его никогда не забудет)).
Даже оракл в своей 12-ой версии всё таки ввел такое поле)

<class name="Payment" table="BufferPaymentTable">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class=" increment " />
</id>

Вот при таком маппинге СУБД забывает инкремент и при перезапуске Томката начинает с id=1
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736880
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
ложись спать.
Я уже сказал - измени маппинг.
Я твой маппинг видел.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736892
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geronemo,
конструкция getNextId() не гарантирует уникальных идентификаторов, если только её вызов не сериализован.
Если очень хочется получить управляемый счетчик, то лучше завести для него специальную таблицу и использовать встроенный table-generator (@TableGenerator)
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38736941
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemo,
ложись спать.
Я уже сказал - измени маппинг.
Я твой маппинг видел.

Неплохо бы подсказочку тут. Методом тыка убивается слишком много времени.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38737029
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
Код: java
1.
GenerationType.IDENTITY


только непонятно, почему у тебя JPA а не аннотации хибера
...
Рейтинг: 0 / 0
25 сообщений из 64, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / org.hibernate.MappingException: Java Hibernate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]