Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с hibernate 
V
    Опции темы
Grelloo
Дата 7.4.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Исходные данные: есть долгоживущий класс Honey, класс инициализирующий sessionFactory и сам клиент, которые записывают таблицу honey в базу данных Mysql.

Долгоживущий класс Honey.java

Код

package example;
public class Honey {

    private Integer id;
    private String name;
    private String taste;
    public Honey() {}

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getTaste() {
        return taste;
    }
    public void setTaste(String taste) {
        this.taste = taste;
    }
}


Файл InitSessionFactory.java

Код

package hibernate;

import javax.naming.InitialContext;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;

public class InitSessionFactory {

    private InitSessionFactory() {    }

    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

    /** The single instance of hibernate configuration */
    private static final Configuration cfg = new Configuration();

    /** The single instance of hibernate SessionFactory */
    private static org.hibernate.SessionFactory sessionFactory;

    public static SessionFactory getInstance() {
        if (sessionFactory == null)
            initSessionFactory();
        return sessionFactory;
    }

    public Session openSession() {
        return sessionFactory.getCurrentSession();
    }

    public Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    private static synchronized void initSessionFactory() {
        Logger log = Logger.getLogger(InitSessionFactory.class);
        if (sessionFactory == null) {
        

            try {
                cfg.configure(CONFIG_FILE_LOCATION);
                String sessionFactoryJndiName = cfg
                .getProperty(Environment.SESSION_FACTORY_NAME);
                if (sessionFactoryJndiName != null) {
                    cfg.buildSessionFactory();
                    log.debug("get a jndi session factory");
                    sessionFactory = (SessionFactory) (new InitialContext())
                            .lookup(sessionFactoryJndiName);
                } else{
                    log.debug("classic factory");
                    sessionFactory = cfg.buildSessionFactory();
                }

            } catch (Exception e) {
                System.err
                        .println("%%%% Error Creating HibernateSessionFactory %%%%");
                e.printStackTrace();
                throw new HibernateException(
                        "Could not initialize the Hibernate configuration");
            }
        }
    }
    
    public static void close(){
        if (sessionFactory != null)
            sessionFactory.close();
        sessionFactory = null;
    
    }
}


Ну и непосредственно клиент

Код

package example;

import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import hibernate.InitSessionFactory;

public class TestExample {

    private static Logger log =Logger.getLogger(TestExample.class);

    public static void main(String[] args) {
    /*    Honey forestHoney = new Honey();
        forestHoney.setName("forest honey");
        forestHoney.setTaste("very sweet");
                Honey forest = new Honey();
                forest.setName("forest honey");
                forest.setTaste("very bad");
        Honey countryHoney = new Honey();
        countryHoney.setName("country honey");
        countryHoney.setTaste("tasty");
        createHoney(forestHoney);
        createHoney(countryHoney);
                createHoney(forest);
        log.debug(forestHoney);
        log.debug(countryHoney);
        deleteHoney(forestHoney); */
        listHoney(); 
          }
    private static void listHoney() {
        Transaction tx = null;
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        try {
            tx = session.beginTransaction();
                        List honeys = session.createQuery("from Honey as h WHERE name = 'forest honey'").list();
                                                for (Iterator iter = honeys.iterator(); iter.hasNext();) {
                Honey element = (Honey) iter.next();
                                System.out.print(element); System.out.println(" hello baby"); 
                                System.out.println("Name = " + element.getName());
                                System.out.println("Taste = " + element.getTaste());
                                log.debug(element);
            }
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            if (tx != null && tx.isActive())
                tx.rollback();

        }
    }

    private static void deleteHoney(Honey honey) {
        Transaction tx = null;
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        try {
            tx = session.beginTransaction();
            session.delete(honey);
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            if (tx != null && tx.isActive())
                tx.rollback();
        }
    }

    private static void createHoney(Honey honey) {
        Transaction tx = null;
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        try {
            tx = session.beginTransaction();
            session.save(honey);
            tx.commit();
                } catch (HibernateException e) {
            e.printStackTrace();
            if (tx != null && tx.isActive())
                tx.rollback();
        }
    }
}


Проблема: если я убираю комментарии в TestExample, то все работает (таблица заполняется нужными значениями, выборка работает, нужные значения удаляются). Если же я снова ставлю комментарии, то TestExaple запускается, но при это таблица оказывается пустой.
Что можно сделать?

Это сообщение отредактировал(а) tux - 8.4.2006, 03:08
PM MAIL ICQ   Вверх
tux
Дата 8.4.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Уже второй топик с одним и тем же, первый был от WhiteDream здесь - http://forum.vingrad.ru/index.php?showtopic=90006. Киньте в конец концов ссылку откуда вы этот пример берете, у меня все работает. Правда здесь непонятно каким образом используется JTA (метод getCurrentSession()).

В общем, ссылку, а также hibernate.cfg.xml, текст маппингов и описание того как разворачивается приложение в студию.
PM MAIL Skype GTalk Jabber YIM   Вверх
Grelloo
Дата 8.4.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Ссылочка вот, все полностью расписано
http://www.laliluna.de/first-hibernate-example-tutorial.html
Вот тексты маппингов:

Honey.hbm.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="example">
  <class name="Honey" table="honey" >

    <id name="id" >
     <generator class="increment"/>
    </id>
    <property name="name" type="string"></property>
    <property name="taste" type="string"></property>
  </class>
</hibernate-mapping>



hibernate.cfg.xml
Код

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

  <session-factory>

      <property name="connection.url">jdbc:mysql://localhost:3306/firsthibernate</property>
      <property name="connection.username">root</property>
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="connection.password">demon999</property>
 
    <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>

    <property name="current_session_context_class">thread</property>
    <!-- this will show us all sql statements -->
    <property name="hibernate.show_sql">true</property>
    <!-- this will create the database tables for us -->
    <property name="hibernate.hbm2ddl.auto">create</property>
    <mapping resource="example/Honey.hbm.xml" />

  </session-factory>

</hibernate-configuration>


Все это закидываю в NetBeans, подключаю библиотеки hibernate 3.1.1, создаю базу firsthibernate и запускаю.

PM MAIL ICQ   Вверх
tux
Дата 9.4.2006, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Ответ оказался прост, я то думал какие-то проблемы с обработкой транзакций. На самом деле все дело вот в этом свойстве, которое у тебя указано в hibernate.cfg.xml:
Код

<property name="hibernate.hbm2ddl.auto">create</property>

Значение create говорит о том, что таблица должна быть создана при инициализации hibernate. Каждый раз при запуске приложения таблица удаляется и создается заново, естественно совершенно пустая. Если выполнять код с закомментированными строками, то таблица пустой и остается.

Теперь о том как решить проблему. Либо удали это свойство совсем либо поменяй значение свойства на update, тогда hibernate будет проверять наличие таблицы и ее соответствие маппингу и, если таблица существует, удалять и создавать ее заново не будет. Есть еще два возможных значения: validate (проверяет наличие таблицы и если ее нет генерирует исключение) и create-drop (таблица создается при инициализации hobernate и удаляется во время завершения приложения).

Та же самая проблема у WhiteDream. Интересно, что в исходниках, которые приведены на самой странице по ссылке такого свойства нет и все замечательно работает, зато есть в архиве с исходниками. smile

Еще одно замечание. Хотя у товарища автора указано, что используется Hibernate версии 3.x, с версиями ниже 3.1 пример работать не будет.

Это сообщение отредактировал(а) tux - 9.4.2006, 06:05
PM MAIL Skype GTalk Jabber YIM   Вверх
Grelloo
Дата 9.4.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Спасибо, все работает. Сделал два вывода: быть осторожней со всякими quickstart и читать документацию надо с самого начала и в оригинале.
Да, еще вопрос, по поводу Axis, есть для него что-нибудь как для hibernate книга "Hibernate in Action". То есть нормальная книжка в которой подробно все расписано. Я конечно начал уже смотреть user guide и прочитал темы по созданию веб-сервисов (вашу и Domestic Cat), но все же хотелось бы чем-нибудь запастись smile
Думаю для этого новый топик делать пока не стоит.
PM MAIL ICQ   Вверх
tux
Дата 9.4.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Практически вся существующая литература по Axis указана на сайте проекта вот здесь: http://ws.apache.org/axis/java/reading.html.
PM MAIL Skype GTalk Jabber YIM   Вверх
umen
Дата 20.4.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



Цитата(Grelloo @ 9.4.2006,  10:38)
Сделал два вывода: быть осторожней со всякими quickstart и читать документацию надо с самого начала и в оригинале.

Даже в оригинале - в примере, который поставляется с Hibernate, в конфигурационном файле указано

Код

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>


а запускается пример командами

ant run -Daction=store //тут база заполняется тестовыми значениями

или

ant run -Daction=list //тут тетстовые значения выводятся на экран

Так вот если запустить первую команду, то в базе появляется запись,
а после запуска второй команды на экран ничего не выводится, так как при запуске база пересоздаётся!

Хотел было уже создавать новую тему по этому поводу, но вовремя воспользовался поиском smile


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0870 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.