我正在尝试用Java构建一个4层Web应用程序。我正在使用Hibernate Framework for ORM和MySQL数据库。 表“项目”与表“想法”具有一对多的关系。我正在尝试做的是使用以下函数获取一个List(或Set)的想法:
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()收到的列表大小在插入之前存储在数据库中的想法数量和实际想法数量之间有所不同。 这是我用于将Idea插入数据库的函数:
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>
先谢谢你的帮助。
答案 0 :(得分:0)
你知道,hibernate很酷。一旦你开始工作,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;
}
答案 1 :(得分: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;
案件结案。