powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / org.hibernate.MappingException: Java Hibernate
64 сообщений из 64, показаны все 3 страниц
org.hibernate.MappingException: Java Hibernate
    #38732219
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил еревести общение с базой на Hibernate.

есть класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.sql.Timestamp;

@XmlRootElement
public class Payment
{
    public Payment(int id, int clientId, String paymenttype, int paymentvalue, int account, Timestamp timestamp) {
        this.id = id;
        this.clientId = clientId;
        this.paymenttype = paymenttype;
        this.paymentvalue = paymentvalue;
        this.account = account;
        this.timestamp = timestamp;
    }

    public Payment() {

    }


    int id = 0;

    int clientId = 0;

    String paymenttype = "";

    int paymentvalue = -1;

    int account = -1;

    Timestamp timestamp;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @XmlAttribute
    public int getClientId() {
        return clientId;
    }

    public void setClientId(int clientId) {
        this.clientId = clientId;
    }

    @XmlElement
    public String getPaymenttype() {
        return paymenttype;
    }

    public void setPaymenttype(String paymenttype) {
        this.paymenttype = paymenttype;
    }

    @XmlElement
    public int getPaymentvalue() {
        return paymentvalue;
    }

    public void setPaymentvalue(int paymentvalue) {
        this.paymentvalue = paymentvalue;
    }

    @XmlElement
    public int getAccount() {
        return account;
    }

    public void setAccount(int account) {
        this.account = account;
    }

    public Timestamp getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Timestamp timestamp) {
        this.timestamp = timestamp;
    }
}



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Также есть Payment.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

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

        <property name="clientid" type="java.lang.Integer">
        <column name="clientid" length="10" not-null="true" unique="false" />
        </property>

        <property name="paymenttype" type="string">
            <column name="paymenttype" length="20" not-null="true" unique="false" />
        </property>

        <property name="account" type="java.lang.Integer">
        <column name="account" length="10" not-null="true" unique="false" />
        </property>

        <property name="paymentvalue" type="java.lang.Integer">
        <column name="paymentvalue" length="10" not-null="true" unique="false" />
    </property>

        <property name="timestamp" type="java.sql.Timestamp">
            <column name="currenttime"  not-null="true" unique="false" />
        </property>

    </class>
</hibernate-mapping>



И еще есь такое
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

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



Вылетает ошибка org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
Я уже перетыкал все переменные, но так и немогу понять из-за чего это.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38732257
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,


все бы хорошо, но тут форум по мускл.
Лично я не хибернил больше десятка лет...

Поспрашивайте
http://www.sql.ru/forum/java

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38732307
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoВылетает ошибка org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
Я уже перетыкал все переменные, но так и немогу понять из-за чего это.

1) Хотелось бы увидеть стектрейс.
2) Есть подозрение, что Hibernate не понимает XML-аннотации
Попробуйте добавить аннотации @Entity, @Id, @Column и т.д.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38732443
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обычно такая ошибка бывает, когда меппинг не совпадает с классом.
Я, например, вижу, что в меппнге объявлено свойство client i d, а в классе - client I d. Этого достаточно, чтобы не взлетело
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38732548
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraОбычно такая ошибка бывает, когда меппинг не совпадает с классом.
Я, например, вижу, что в меппнге объявлено свойство client i d, а в классе - client I d. Этого достаточно, чтобы не взлетело

Да, Вы правы. Я много таких мелочей поправил, эта была последняя, которую не заметил. Все заработало.
Теперь у меня 2 вопроса.
1. Как описать в маппинг файле id int(10) auto_increment, который еще к тому же primary key (id)
У меня записано так
Код: xml
1.
2.
3.
4.
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>



2. Также вопрос по такому моменту.
Вот эта строчка занимает довольно много времени
Session session = HibernateUtil.createSessionFactory().openSession();
у меня же входящий поток данных от разных источников, где-то 70000 запросов в час, можно ли держать сессию открытой все время, просто делать
Код: java
1.
2.
3.
            session.beginTransaction();
            ........................
            session.getTransaction().commit();


А закрывать ее
Код: java
1.
session.close();


, когда сервер остнавливается
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38733124
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, все верно. Не надо каждый раз открывать и закпывать сессию, если мы постоянно обращаемся в БД с однотипными запросами. У меня после открытия 150 сессий вылетало исключение и я сделал такую штуку в своем сервлете
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public void init(javax.servlet.ServletConfig config)
            throws javax.servlet.ServletException
    {
          ......
          session = HibernateUtil.createSessionFactory().openSession();

    }
.......
    public void destroy() {
        .....
        session.close();
    }



Ntgthm
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38733143
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я почитал несколько описаний пакета Hibernate и везде увидел вот такую штуку,кроме всего того, что уже сделано

1. Для каждого класса данных, связанных с таблице *.hbm.xml создается DAO интерфейс.
2. Для каждого интерфейса создается его реализация.
3. Создается класс фабрики.

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

Потому что у меня есть тупо 3 файла, которые я описал выше. Мой сервлет получает данные в xml ввиде, они парсятся в объект класса Payment
И я делаю
Код: java
1.
2.
3.
4.
            session.beginTransaction();

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



Что там еще за геморрой с DAO ?
Я не особо понимаю, зачем он мне тут нужен.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38733175
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
- сессия хибера открывается не долго - проверь
- сессию надо открыть в начале серлета и закрыть в конце - доли секунды
- каждый сервлет в потоке. Если делать на инициал.сервлета, то будут ошибки
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38733177
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
для 1 класса пиши как угодно
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38733273
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemo,
- сессия хибера открывается не долго - проверь
- сессию надо открыть в начале серлета и закрыть в конце - доли секунды

Проверим, обязательно
Если делать на инициал.сервлета, то будут ошибки
А что за ошибки. Я немного погонял (полчаса) с открытой сессией, все как по маслу.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38733279
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
2 объекта с одинм ID в хибере параллельно из 2-х потоков-сервлетов
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38734321
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НЕ могу понять, что не так. Хочу сделать Hibernate HQL select запрос с 2-мя условиями, но вылетает ошибка,

Код: java
1.
2.
3.
4.
                        query =  session.createQuery(
                                "from BufferPaymentTable BFT where BFT.paymenttype = :paymenttype  and BFT.currenttime < :currenttime");
                        query.setParameter("paymenttype", strtype);
                        query.setParameter("currenttime", timestamp);



org.hibernate.hql.internal.ast.QuerySyntaxException: BufferPaymentTable is not mapped [from BufferPaymentTable BFT where BFT.paymenttype = :paymenttype and BFT.currenttime < :currenttime]

У меня есть hbm.xml файл, где BufferPaymentTable связывается с классом Payment (1-е сообщение).
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38734431
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,

Так надо же намэпленный класс указывать в HQL, а не таблицу в базе.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735204
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин МаркGeronemo,

Так надо же намэпленный класс указывать в HQL, а не таблицу в базе.

ДА, разобрался. К сожалению в инете так слабо с материалом, что много приходится делать методом тыка.

Сейчас вот такая проблема появилась. Перевел все общение с БД на Hibernate.
Нормально все работает 5 минут. За эо время постпает на сервлет 6000 запросов, все они пишутся в пределах одной сессии во временную базу. И раз в 5 секунд отдельный поток извлекает все записи из этой таблицы и помещает в другую (+ идет обработка не связанная с БД). Судя по логам 5 минут все происходит как надо, а потом начинает вываливаться вот такое

авторex org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735294
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, я сделал 2 полярных решения.

1. Открываем и закрываем сессию при каждом обращении к БД.
Где-то после 150 запросов при каждом обращение вылетает
ex org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect

2.Я открыл сессию в самом начале и не закрываю, пока приложение работает.
пара тысяч записей отработали. Местами коряво и данные в БД оказались не такими, как должны.
в логе повторяющаяся ошибка
ex org.hibernate.TransactionException: nested transactions not supported

Т. е. получается. Что так, что так неправильно. Попахивает большим бредом. Потому что, когда у меня не было Hibernate все отлично работало на протяжении нескольких часов и миллиона записей в БД
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735295
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не закрываете соединения?
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735335
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самое время закончить заниматься самодеятельностью и воспользоваться менеджером соединений
- серверным datasource, если это сервер приложений
- c3p0 или чем-то подобным в противном случае
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735347
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovНе закрываете соединения?

Я пробовал закрывать каждое соединение. Также пробовал не закрывать вообще. И так и так вылета.т исключения, просто разные.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735355
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo,
давай код в 1 варианте
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735356
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo1. Открываем и закрываем сессию при каждом обращении к БД.
не при каждом к БД, а в начале и конце сервлета
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735364
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Меня опять терзают смутные сомнения", что сессии, которую вы создаёте используют одно-единственное подключение.
В результате команды из разных потоков перемешиваются со страшной силой, что и приводит к ошибке "недопустимы вложенные транзакции".
Вариантов, собственно, два:
1. Как уже сказали - пул подключений;
2. Очередь из java.util.concurrent куда потоки сервлета будут складывать объекты с параметрами запроса, а единственный (отдельный) поток будет их выгребать и отправлять в базу.

P.S. Зачем явно стартовать транзакцию для единственного DML-оператора?
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735421
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemo,
давай код в 1 варианте
Вот такое у меня в doPost сервлета, куда посылается несколько сотен запросов в секунду. Без Hibernate все эти запросы успевали обрабатываться. А здесь висяк уже после 15
Код: java
1.
2.
3.
4.
5.
6.
            Session session = HibernateUtil.createSessionFactory().openSession();
            session.beginTransaction();

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



Также есть и другие места, где создаются сессии и закрываются, например. Если лень читать (я это вполне понимаю), то тут каждый 5 секунд происходит некоторая цепочка по по изъятию данных из одной таблицы, записи в другую и передачи их обработчикам. Несколько раз я открываю соединения, после использования сразу же закрываю.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
        while (ServerConfig.getServerConfig().isServerworking())
        {
            try
            {
                Thread.sleep(5000);


                Logger.getLogger().write("before loadallPaymentsFromBufferAndSaveAsProcessing");

                Session session = HibernateUtil.createSessionFactory().openSession();

                session.beginTransaction();

                Query query = session.createSQLQuery("select now();");
                List <Timestamp> timestampList =  query.list();
                Timestamp timestamp = timestampList.get(0);

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

                boolean newData = false;

                session = HibernateUtil.createSessionFactory().openSession();

                session.beginTransaction();

                NodeList nList = ServerConfig.getServerConfig().getnList();

                /**
                 * загружаем из временной буфер-таблицы все полученные от клиентов даннык.
                 */

                List <ArrayList<Payment>> listsOfAllPayments = new  ArrayList <ArrayList<Payment>>();

                for (int i = 0; i < nList.getLength(); i++) {

                    Node nNode = nList.item(i);
                    Element eElement = (Element) nNode;
                    List<Payment> listsOfPayments = null;

                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                        String strtype = eElement.getElementsByTagName("paymenttype").item(0).getTextContent();

                        query =  session.createQuery(
                                "from Payment  where paymenttype = :paymenttype and currenttime < :currenttime");
                        query.setParameter("paymenttype", strtype);
                        query.setParameter("currenttime", timestamp);

                        listsOfPayments = (List<Payment>)query.list();
                    }

                    if (listsOfPayments.size() > 0)
                        newData = true;

                    // Сохраняем эти данные в список списков (упорядочено по типу платежа)
                    listsOfAllPayments.add((ArrayList)listsOfPayments);
                }

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


                List<ArrayList<OperationPaymentData>> listsOfAllProcessingPayments = new ArrayList<ArrayList<OperationPaymentData>>();

                if (newData) {
                    /**
                     * Сохраняем все платежи в таблицу операций со статусом 'processing'
                     */
                    session = HibernateUtil.createSessionFactory().openSession();
                    session.beginTransaction();

                    for (int i = 0; i < listsOfAllPayments.size(); i++) {

                        List<Payment> listsOfPayments = listsOfAllPayments.get(i);
                        ArrayList<OperationPaymentData> listsOfProcessingPaymentsOfThisType = new ArrayList<OperationPaymentData>();

                        OperationPaymentData operationPaymentData = null;

                        for (int j = 0; j < listsOfPayments.size(); j++) {
                            Payment payment = listsOfPayments.get(j);
                            operationPaymentData = new OperationPaymentData(payment.getId(), payment.getClientId(), payment.getPaymenttype(),
                                    payment.getAccount(), payment.getPaymentvalue(), payment.getTimestamp());

                            listsOfProcessingPaymentsOfThisType.add(operationPaymentData);

                            session.save(operationPaymentData);
                        }

                        listsOfAllProcessingPayments.add(listsOfProcessingPaymentsOfThisType);

                        Logger.getLogger().write("loadallPaymentsFromBufferAndSaveAsProcessing3");
                    }

                    session.getTransaction().commit();
                    session.close();
                }
                /**
                 * удаляем из буфер-таблицы извлеченные оттуда записи
                 */

                session = HibernateUtil.createSessionFactory().openSession();
                session.beginTransaction();
                query =  session.createQuery(
                        "delete  from Payment  where  currenttime < :currenttime");
                query.setParameter("currenttime", timestamp);
                query.executeUpdate();

                session.getTransaction().commit();

                session.close();

                Logger.getLogger().write("after loadallPaymentsFromBufferAndSaveAsProcessing");

                for (ArrayList<OperationPaymentData> listsOfProcessingPaymentsOfThisType : listsOfAllProcessingPayments) {

                    if (listsOfProcessingPaymentsOfThisType.size() > 0) {
                        String strtype = listsOfProcessingPaymentsOfThisType.get(0).getPaymenttype();


                        PayData paydata = new PayData();
                        Logger.getLogger().write("Sending to operator, paymenttype = " + listsOfProcessingPaymentsOfThisType.get(0).getPaymenttype());
                        paydata.proceedPayments(listsOfProcessingPaymentsOfThisType, ServerConfig.getServerConfig().getURLByType(strtype));
                    }

                }
            } catch (Exception e) {
                Logger.getLogger().write("PaymentRouter, ex " + e.toString());
            }

        }
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735427
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraСамое время закончить заниматься самодеятельностью и воспользоваться менеджером соединений
- серверным datasource, если это сервер приложений
- c3p0 или чем-то подобным в противном случае

Добавил вот такое в hibernate.cfg.xml
<property name="hibernate.c3p0.min_size">10</property>
<property name="hibernate.c3p0.max_size">0</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735461
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, как только я добавил c3p0 в проект, у меня перестало что-либо писаться в базу вообще. Сейчас я это удалил и пишутся 144 записи, дальше org.hibernate.exception.JDBCConnectionException: Error calling Driver#connecе

Методом перебора разных методов, на данный момент лучшим у меня является следующий.
1. никакого c3p0
2. Сервлет, который получает несколько сотен запросов работает с одним открытым соединением
3. Потоки, которые лязят в базу раз в несколько секунд каждый раз открывают и закрывают соединение.
Таки образом у меня записалось 7200 записей. Дальше пошли org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38735466
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo
Код: 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 мин просто вставку в БД
....
работает?
...
Рейтинг: 0 / 0
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
org.hibernate.MappingException: Java Hibernate
    #38737282
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Geronemo,
Код: java
1.
GenerationType.IDENTITY


только непонятно, почему у тебя JPA а не аннотации хибера

Потому что я пока только учусь (c) Я был программером, потом на некоторое время ушел в другую отрасль, показалось тогда сильно перспективнее. Но вся перспектива там закончилась и я хочу вернуться.
Я ищу работу и мне данное задание дали как тестовое. Потом на вакантное место взяли какого-то студента за копейки и я стал продолжать его делать и наворачивать по своему усмотрению. Когда гуглил Hiberbate, мне подобная реализация попала на глаза раньше, чем с аннотациями. Поэтому я решил делать именно так.

Кстати, IDENTITY работает, Спасибо.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38750553
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В моем новом проекте я решил использовать ORM с помощью аннотаций, а не xml файлов

Вылетает вот такая ошибка org.hibernate.TypeMismatchException: Provided id of the wrong type for class DB.UserInfo. Expected: class java.lang.Integer, got class java.lang.String
я уже перебрал несколько различных аннотаций к id, но все одно и то же

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
@Entity
@Table(name="Users")
public class UserInfo
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="firstName")
    private String firstName;

    @Column(name="lastName")
    private String lastName;

    @Column(name="login")
    private String login;

    @Column(name="userPassword")
    private String Password;
......
}



В базе MySQL таблица выглядит так
Код: sql
1.
create table Users (id int(10) auto_increment,  firstName varchar(20),  lastName varchar(20), login varchar(15), userPassword varchar(15), primary key (id));
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38750562
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понятно почему в ошибке вылез String. Где-то вы нас обманываете.
Для id рекомендуется использовать тип обертку (Long, Integer), чтобы ORM мог отличить новые объекты (id == null) от уже сохраненных.
Если остро нужен примитив, то можно попробовать указать unsaved-value. Не знаю позволяют ли это аннотации.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38750622
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczНе понятно почему в ошибке вылез String. Где-то вы нас обманываете.
Для id рекомендуется использовать тип обертку (Long, Integer), чтобы ORM мог отличить новые объекты (id == null) от уже сохраненных.
Если остро нужен примитив, то можно попробовать указать unsaved-value. Не знаю позволяют ли это аннотации.

Да, ошибка не тут. Потому каак стало вылетать вот такое
org.hibernate.hql.internal.ast.QuerySyntaxException: Users is not mapped [from Users where login = : login]

когда я подправил запросик
Код: java
1.
2.
3.
4.
5.
            session = HibernateUtil.getSessionFactory().openSession();
            Query query = session.createQuery("from Users where login = : login");
            query.setParameter("login", login);
            users = (List<UserInfo>)query.list();
            user = users.get(0);



В Hibernate.cfg.xml вот такая строчка
<mapping class="DB.UserInfo" />
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38750650
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В запросе должно быть название сущности. Users это всего лишь таблица для мапинга её.
Код: java
1.
            Query query = session.createQuery("from UserInfo where login = : login");
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38750655
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, уже раз пятый пишу
Users - имя таблицы
UserInfo - имя сущности
HQL, JPQL, Criteria API оперируют сущностями и свойствами
SQL оперирует таблицами и колонками
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38750659
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoДа, ошибка не тут. Потому каак стало вылетать вот такое
org.hibernate.hql.internal.ast.QuerySyntaxException: Users is not mapped [from Users where login = : login]

Вам с Елдосом дружить надо. Он тоже сначала на форуме спрашивает, а потом пишет что его ответ не интересует так как ошибка в другом.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38750668
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот блин, столько времени впустую потратил. Спасибо.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38752143
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, я опять запутался. Нид хелп.

есть сущность
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
@Entity
@Table(name="writer")
public class WriterInfo
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="firstName")
    private String firstName;

    @Column(name="lastName")
    private String lastName;

    @Column(name="fullName")
    private String fullName;

    @Column(name="info")
    private String info;
...
}



и вот такая попытка достать всех авторов, удовлетворяющих требованиям. Получаю 0 авторов, хотя я делаю копипаст всех параметров и автор точно должен быть 1.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    public List<WriterInfo> getWriters(String firstName, String lastName, String fullName) throws SQLException
    {
        Session session = null;
        List<WriterInfo> writers = null;

        try {
            session = HibernateUtil.getSessionFactory().openSession();

            Logger.getLogger().write(firstName+lastName+fullName);

            WriterInfo writer = new WriterInfo();

            if (fullName != null && fullName.length() > 0)
                writer.setFullName(fullName);

            if (firstName != null && firstName.length() > 0)
                writer.setFirstName(firstName);

            if (lastName != null && lastName.length() > 0)
                writer.setLastName(lastName);

            Example example = Example.create(writer).enableLike().excludeProperty();


            writers = session.createCriteria(WriterInfo.class).add(example).list();

            Logger.getLogger().write(writers.size()+"");

        } catch (Exception e) {
            Logger.getLogger().write("5555");


        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
        return writers;
    }



также попытался переделать немного по-другому и вылетает исключение
org.hibernate.QueryParameterException: could not locate named parameter [firstName]

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
    public List<WriterInfo> getWriters(String firstName, String lastName, String fullName) throws SQLException
    {
        Session session = null;
        List<WriterInfo> writers = null;

        try {
            session = HibernateUtil.getSessionFactory().openSession();

            WriterInfo writer = new WriterInfo();

            if (fullName != null && fullName.length() > 0)
                writer.setFullName(fullName);

            if (firstName != null && firstName.length() > 0)
                writer.setFirstName(firstName);

            if (lastName != null && lastName.length() > 0)
                writer.setLastName(lastName);

            writers = session.createSQLQuery("select * from WriterInfo").setParameter("firstName", writer.getFirstName()).
                    setParameter("lastName", writer.getLastName()).setParameter("fullName", writer.getFullName()).list();

            Logger.getLogger().write(writers.size()+"");

        } catch (Exception e) {
            Logger.getLogger().write("5555");


        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
        return writers;
    }



В будущем мне тут надо бы еще как-то сделать так, чтобы можно было искать авторов по 1 или 2-м полям, а также по частичным совпадениям
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38752150
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такое работает

Код: java
1.
2.
            writers = session.createQuery("from WriterInfo where firstName Like :firstName and lastName like :lastName and fullName like :fullName").
                    setParameter("firstName", writer.getFirstName()).setParameter("lastName", writer.getLastName()).setParameter("fullName", writer.getFullName()).list();



теперь надо бы придумать так, чтобы

GeronemoВ будущем мне тут надо бы еще как-то сделать так, чтобы можно было искать авторов по 1 или 2-м полям, а также по частичным совпадениям
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38752342
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geronemo, сам себя цитируешь? Признак гения наверное...

Чтобы искать по 1-2 м полям нужно написать 1-2 текста предложеня "WHERE ".
Как написать это уже другой вопрос я так ду.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38753002
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Небольшая проблемка нарисовалась.

Есть вот такая сущность

@Entity
@Table(name="Book")
public class BookInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;

@Column(name="authorId")
private int authorId;

@Column(name="bookName")
private String bookName;

@Column(name="numberOfBooks")
private int numberOfBooks;

@Column(name="currentNumberOfBooks")
private int currentNumberOfBooks;

Setters and Getters

XXXXXXXXXXXXXX

}

У каждой книги есть автор и мне было бы очень удобно вместо XXXXXXXX вставить объект класса автор (когда я решу, что у книги может быть несколько авторов, я поменяю этот на List).

Проблема в том, что, когда у меня прописан объект XXXXXXX, то вылетает исключение org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Если XXXXXX удалить, то все нормально работает. Но, тогда мне где-то в другом месте надо довольно сильно нагромоздить кода и несколько лишних раз слазить в БД. Я бы хотел данные об авторе хранить здесь, это было бы самым элегантным решением. Вопрос, возможно ли это. Может существует какая-то аннотация, которая новому объекту в этом классе не будет пытаться найти соответствие в базе.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38753239
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeronemoМожет существует какая-то аннотация, которая новому объекту в этом классе не будет пытаться найти соответствие в базе.
При чем тут объекты? Речь о структуре сущности - классах и свойствах, а не объектах. Свойство можно пометить как @Transient, чтобы хибернейт его игнорировал. Только почему просто не замапить @ManyToMany мне не понятно.
...
Рейтинг: 0 / 0
org.hibernate.MappingException: Java Hibernate
    #38753522
Geronemo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz Только почему просто не замапить @ManyToMany мне не понятно.

Вкратце ответ прост - я до этого пока не дорос. На данный момент у меня происходит вот такая штука. Я пишу thin-client приложение для обслуживания библиотеки (выдать книгу, вернуть книгу, зарегистрировать нового читателя и т. д.) используя Glassfish 4, JSF framework, MySQL.
Начинаю с малого, т. к. с Glassfish 4, JSF framework я раньше не работал. Сейчасу меня работает несколько функций, типа логина в систему и

Поиска книги по параметрам автора и названия произведения.
В итоге я имею ArrayList <Book>
в хhtml вот таким образом я отображаю названия произведений.
<ui:repeat var="item" value="#{findBookProcess.listOfBooks}"> <h1>#{item.bookName}</h1>
</ui:repeat>
и мне было бы очень удобно, чтобы в item (элемент ArrayList класса Book) содержал в себе в том числе и инфу об авторе. Но Book это есть @Entity
@Table(name="Book")
и при добавлении туда полей вылетает ошибка orh.Hibernate....
Я сейчас сделал так - завел второй массив ArrayList <Writer> и в нем каждому i-му автору соответствует i-й элемент из Book И осталось только придумать, как это выводить ввиде таблицы 2xN (N - длина массива) в xhtml файл.

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


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