论坛首页 Java版 Hibernate

Spring+Hibernate组合使用时的奇怪问题

浏览 2373 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-08-10
本人初次尝试使用Spring+Hibernate,经过一番摸索后,实现了检索功能,但不能插入记录。我把代码贴出来,请各位大哥帮我看看。
配置文件applicationContext.xml
引用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  <bean id="BBSDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
      <value>org.postgresql.Driver</value>
    </property>
    <property name="url">
      <value>jdbc:postgresql://localhost/xxxx</value>
    </property>
    <property name="username"><value>xxxx</value></property>
    <property name="password"><value>xxxx</value></property>
  </bean>
 
  <bean id="BBSSessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
    <property name="mappingResources">
      <list>
        <value>hbm/Member.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">net.sf.hibernate.dialect.PostgreSQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.use_out_join">false</prop>
      </props>
    </property>
    <property name="dataSource"><ref bean="BBSDataSource" /></property>
  </bean>
 
  <bean id="BBSTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager" >
    <property name="sessionFactory">
      <ref bean="BBSSessionFactory" />
    </property>
  </bean>

  <bean id="BBSTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager">
      <ref bean="BBSTransactionManager" />
    </property>
    <property name="transactionAttributeSource">
      <value>
        com.openingsys.bbs.users.MembersBiz.*=PROPAGATION_REQUIRED
      </value>
    </property>
  </bean>
 
  <bean id="MembersBizTarget" class="com.openingsys.bbs.users.MembersBiz">
    <property name="sessionFactory">
      <ref bean="BBSSessionFactory" />
    </property>
  </bean>
 
  <bean id="BizObjs" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.openingsys.bbs.BizObjInterface</value>
    </property>
    <property name="interceptorNames">
      <list>
        <value>BBSTransactionInterceptor</value>
        <value>MembersBizTarget</value>
      </list>
    </property>
  </bean>
 
</beans>


业务对象MembersBiz.java

[code:1]public class MembersBiz extends HibernateSupport implements BizObjInterface {

public void create(Object obj) throws ObjectDuplicateException, Exception {
Session session = super.getSession();
try {
// check if the loginid is already exist
List list = session.find("from com.openingsys.bbs.users.Member as m where m.loginId = ?",
((Member)obj).getLoginId(),
new StringType());
if (list.size() != 0) {
throw new ObjectDuplicateException("The LoginId '" + ((Member)obj).getLoginId() + "' is already exist!");
}

session.save(obj);
} catch (Exception e) {
e.printStackTrace();
throw e;
}

}

/* (non-Javadoc)
* @see com.openingsys.bbs.BizObjInterface#delete(java.io.Serializable)
*/
public void delete(Serializable id) throws ObjectMissException, Exception {
Session session = super.getSession();
try {
int i = session.delete("from com.openingsys.bbs.users.Member as m where m.userId = ?",
   (String)id,
   new StringType());
if (i == 0) {
throw new ObjectMissException("The member identified by '" + id + "' was not found!");
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}

}

/* (non-Javadoc)
* @see com.openingsys.bbs.BizObjInterface#update(java.lang.Object)
*/
public void update(Object obj) throws ObjectMissException, Exception {
// TODO Auto-generated method stub

}

/* (non-Javadoc)
* @see com.openingsys.bbs.BizObjInterface#find(java.io.Serializable)
*/
public Object find(Serializable id) throws ObjectMissException, Exception {
Session session = super.getSession();
try {
Member member = (Member)session.get(Member.class, id);
if (member == null) {
throw new ObjectMissException("The member identify by '" + id + "' was not found!");
}
return member;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}

/* (non-Javadoc)
* @see com.openingsys.bbs.BizObjInterface#search(java.util.HashMap, com.openingsys.bbs.Pager)
*/
public List search(HashMap crit, Pager page) throws Exception {
// TODO Auto-generated method stub
return null;
}

}
[/code:1]

测试类TestBean.java
[code:1]public class TestBean {

public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
MembersBiz biz = (MembersBiz) context.getBean("MembersBizTarget");
try {
Member member = (Member)biz.find("john");
System.out.println(member.getEmail());

member = new Member();
member.setLoginId("admin");
member.setUserName("Administrator");
member.setPassword("12345");
member.setEmail("sofjwe");
member.setRegiTime(new Date());
biz.create(member);

// biz.delete("john");
} catch (Exception e) {
e.printStackTrace();
}
}
}
[/code:1]

运行测试类后,一切正常,控制台打印出正确的Email地址,但是数据库中却没有出现我想插入的数据,控制台也没有打印出insert语句。

请各位大哥帮我看看,谢谢。
   
最后更新时间:2004-08-14
如果你从HibernateSupport类直接取得session的话,是不会自动commit的,你必须显示的commit。如果你使用spring的事物处理类(PlatformTranscationManager)的话,就可以自动commit。
   
0 请登录后投票
最后更新时间:2004-08-19
上文中用到的HibernateSupport是我自己写的一个类,并非spring提供。代码如下:[code:1]import org.springframework.orm.hibernate.SessionFactoryUtils;

import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;

/**
* @author jm.lu
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class HibernateSupport {

// This is required to use Hibernate's SessionFactory
private SessionFactory sessionFactory;

/**
* @return Returns the sessionFactory.
*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* @param sessionFactory The sessionFactory to set.
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public Session getSession() {
Session session = SessionFactoryUtils.getSession(getSessionFactory(), true);
return session;
}
}
[/code:1]
这样作也会有不能自动提交的问题吗?
我的想法是:事务规则由配置文件决定,如:
引用
    <property name="transactionAttributeSource">
      <value>
        com.openingsys.bbs.users.MembersBiz.*=PROPAGATION_REQUIRED
      </value>
    </property>

但现在的事实好像是:事务没有开始。不知到这一切中什么地方有错。
   
0 请登录后投票
最后更新时间:2004-08-25
如果没有用到事务,而且你直接用Session,我想大概是没有加入session.flush()方法的原因吧,如有事务,就不需要flush了,不知对不对,请你老试一试
   
0 请登录后投票
最后更新时间:2004-08-26
建立你继承Spring的HibernateDaoSupport类.(getHibernateTemplate().save(Object)方法).并且使用TransactionTemplate类事务提交处理.
   
0 请登录后投票
最后更新时间:2004-09-15
我也碰到同样的问题:
代码:

引用

public class EmployeeServiceImpl implements EmployeeService {

/**
* 创建联系信息
* @param o
* @return
*/
public String createContactInformation(String base64) throws Exception {

String result = null;
try {
Object o = Base64.decodeToObject(base64);
ContactInformation pojo = (ContactInformation)BeanUtilsFactory.getBeanUtils()
.copyProperties(o);
result = contactInformationDAO.createContactInformation(pojo);
}
catch (BeanConvertedException bce) {
System.out.println(bce.getLocalizedMessage());
}
catch (Exception e) {
System.out.println("exception:" + e.getLocalizedMessage());
throw e;
}
return result;
}


public class ContactInformationDAOHibernateImpl extends HibernateDaoSupport
implements ContactInformationDAO {

/**
* 创建联系信息
* @param o
* @return
*/
public String createContactInformation(ContactInformation o) throws DAOException {

String result = null;
result = (String)this.getHibernateTemplate().save(o);
System.out.println("DAO,result:" + result);
return result;
}

   
0 请登录后投票
最后更新时间:2004-09-15
配置文件:
引用

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>jdbc/acc4</value></property>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>com/sfexpress/domain/pojos/base/Currency.hbm.xml</value>
<value>com/sfexpress/domain/pojos/base/ExchangeRate.hbm.xml</value>
<value>com/sfexpress/domain/pojos/base/ContactInformation.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect.Dialect">net.sf.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="jdbc.fetch_size">50</prop>
<prop key="jdbc.batch_size">25</prop>
<prop key="jdbc.use_scrollable_resultset">false</prop>
<!-- 解决Hibernate的Encode的问题 -->
<prop key="connection.useUnicode">true</prop>
<prop key="connection.characterEncoding">UTF-8</prop>
</props>
</property>
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>

<bean id="contactInformationDAO" class="com.sfexpress.server.persistence.hibernate.ContactInformationDAOHibernateImpl">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>

<bean id="baseTxProxy" lazy-init="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

<bean id="employeeService" parent="baseTxProxy">
<property name="target">
<bean class="com.sfexpress.server.business.facade.impl.EmployeeServiceImpl">
<property name="contactInformationDAO"><ref bean="contactInformationDAO"/></property>
</bean>
</property>
</bean>

   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐