Несовместимые структуры данных MySQL / Hibernate - PullRequest
1 голос
/ 17 марта 2012

Я пытаюсь создать 4-уровневое веб-приложение на Java.Я использую Hibernate Framework для ORM и базы данных MySQL.Таблица «проект» имеет отношение «один ко многим» к таблице «идея».То, что я пытаюсь сделать, это получить список (или набор) идей, используя следующую функцию:

public static List getProjectIdeas(int projectId)
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query q = session.createQuery("from Idea where id_project=" + projectId);
        List<Idea> ideaList = (List<Idea>) q.list();
        System.out.println(ideaList.size());
        return ideaList;
    }

Сначала все работает хорошо, и я получаю все идеи из базы данных.Но когда я добавляю новые идеи в проект, а затем снова вызываю функцию, я не всегда получаю полный список идей, связанных с проектом.Размер списка, который я получаю от q.list (), варьируется между количеством идей, сохраненных в базе данных до вставки, и фактическим количеством идей.Это функция, которую я использую, чтобы вставить идею в базу данных:

public static void writeObject(Object object)
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        session.saveOrUpdate(object);
        tx.commit();
    }  

Это мой первый проект hibernate, поэтому я не знаю, если что-то не так с файлом конфигурации:

<?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">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">***/ideator</property>
    <property name="hibernate.connection.username">***</property>
    <property name="hibernate.connection.password">***</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
    <mapping resource="mapping/Category.hbm.xml"/>
    <mapping resource="mapping/Rating.hbm.xml"/>
    <mapping resource="mapping/Idea.hbm.xml"/>
    <mapping resource="mapping/Participation.hbm.xml"/>
    <mapping resource="mapping/Project.hbm.xml"/>
    <mapping resource="mapping/Criteria.hbm.xml"/>
    <mapping resource="mapping/User.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Хорошо, я смог исправить ошибку. Видимо, было не очень хорошая идея использовать getCurrentSession. Лучше управляйте сессией самостоятельно:

Session session = HibernateUtil.getSessionFactory().openSession();
       Transaction tx = null;
       Idea idea = null;

       try {
           tx = session.beginTransaction();
           idea = (Idea) session.get(Idea.class, id);
           tx.commit();
       } catch (Exception e) {
           if(tx != null) {
               tx.rollback();
           }
       } finally {
           session.flush();
       }

       return idea;

Дело закрыто.

0 голосов
/ 17 марта 2012

Просто чтобы вы знали, спящий режим это круто.Когда все заработает, с Hibernate все будет очень просто и легко.Но есть проблемы запуска.Так что вы на правильном пути.Пример кода выше действительно хорош.Это хороший вопрос.Добро пожаловать в stackoverflow.

Это то, что я делаю, и это работает для меня.

Конструктор

Configuration configuration = new Configuration().configure() ;                     
sessionFactory = configuration.buildSessionFactory(new ServiceRegistryBuilder() .buildServiceRegistry());

При сбросе в базу данных

public void flush(Object dataStore) throws DidNotSaveRequestSomeRandomError {
    Transaction txD;
    Session session;
    session = currentSession();
    txD = session.beginTransaction();
    session.saveOrUpdate(dataStore);
    try {
        txD.commit();
    } catch (ConstraintViolationException e) {
        log.error("Unable to store data from "+dataStore.getClass().toString()) ;
        throw new DidNotSaveRequestSomeRandomError(dataStore);
    } catch (TransactionException e) {
        log.debug("txD state isActive" + txD.isActive() + " txD is participating" + txD.isParticipating());
        log.debug(e);
    }  finally {
        txD = null;
        session.close();
    }
}                       

Метод CurrentSession

public final ThreadLocal    session = new ThreadLocal();
public Session currentSession() {
    Session s = (Session) session.get();
    // Open a new Session, if this thread has none yet
    if (s == null || !s.isOpen()) {
        s = sessionFactory.openSession();
        // Store it in the ThreadLocal variable
        session.set(s);
    }
    return s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...