2012-03-17 2 views
1

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

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

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

<?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> 

Заранее благодарим за помощь.

ответ

0

Хорошо, я был в состоянии исправить ошибку. По-видимому, было неплохо использовать 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

Просто, чтобы вы знали, спящий режим прохладен. Как только вы его заработаете, все будет хорошо и легко спящим. Но возникают проблемы. Таким образом, вы на правильном пути. Пример кода выше действительно хорош. Хороший вопрос. Добро пожаловать в 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; 
} 
+0

Спасибо за ваш anwser, но я не уверен, где реализовать эти функции, потому что вместо вашей текущей сессии я использую HibernateUtil.getSessionFactory(). GetCurrentSession(). Я вообще не использую флеш, я думаю, что hibernate делает это автоматически. – Phil

+0

Я не использую Hibernate Util. И флеш - это моя собственная реализация. Hibernate не имеет флеша, он имеет фиксацию. – Siddharth

Смежные вопросы