2014-09-25 72 views
2

请参阅我为用户信息提供user.java。如何使用spring + hibernate将数据插入数据库?

@Entity(name = "user") 
@Table(name = "user") 
public class User { 

    @Id 
    @Column(name = "id") 
    private String id; 
    @Column(name = "password") 
    private String password; 
//getter and setter for this.. 
} 

这是我的UserDAO

public class UserDao { 
    public interface UserDAO { 
     public String insert(User user); 

    } 
} 

,这是实现类,用于插入数据库 看,这是我code.please检查,并告诉我做什么我错

@Repository 
@Transactional 
public class UserImpl implements UserDAO { 

    private DataSource dataSource; 

    @Autowired 
    SessionFactory sessionFactory; 
    @Resource(name = "sessionFactory") 
    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    @Override 
    public String insert(User use) { 

     Session session = this.sessionFactory.openSession(); 
     try{ 

      Session sess = this.sessionFactory.getCurrentSession();    
      session.save(reg); 


         return (String)user.getUserName(); 
         }catch(Exception e){ 
          System.out.println("in catch"+e.getMessage()); 
          e.printStackTrace(); 

    } 

    } 
} 




} 

并在我的控制器成功注册后im插入数据到数据库由此

userDao.insert(user); 

但我没有得到输出意味着没有任何数据插入数据库。为什么这..?这是我的mvc配置

<context:component-scan base-package="com.user.xyz" /> 
    <mvc:annotation-driven /> 
    <mvc:resources mapping="/resources/**" location="/resources/images/, /resources/css/" /> 
    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/view/" /> 
     <property name="suffix" value=".jsp" /> 

    </bean> 
+0

我怀疑你可能只需要到'@ Transactional'注释添加到您的'insert'方法。但是,您拥有JPA实体,那么您有没有使用实体管理器的原因?您不需要触摸Hibernate会话。另请注意,如果您将Spring Data添加到您的项目中,那么您可以删除您的实现并获得更多的免费功能。 :) – Steve 2014-09-25 10:25:16

+0

看到这是我的code.please检查它,并告诉我我做错了什么 – user3189357 2014-09-25 10:35:25

+0

没有错,因为这样...只是有更简单的方法(少代码)可用。本教程提供了一个使用Spring Data的简单示例:http://spring.io/guides/gs/accessing-data-jpa/ ...基本上,您可以将Spring Data添加到您的依赖项中,并修改您的接口以扩展CrudRepository或JpaRepository。那么你不需要编写你自己的DAO实现。 – Steve 2014-09-25 12:08:07

回答

0

请记住:您没有任何存在的会话,但您使用getCurrentSession()。要使用此方法,您必须已经有一个会话。试试这个:

Session session = this.sessionFactory.openSession(); 

现在你有一个交易的会话。

您应该在xml文件(hibernate.xml或spring.xml)中声明sessionFactory,然后使用@Autowire来获取它并打开新会话。

+0

...看到我添加了会话,但仍然没有得到任何数据添加到数据库。你可以检查我的mvc配置文件。有没有必要提供用于实现dao的bean ..? – user3189357 2014-09-25 09:51:35

0

你有两个选择:

A.力休眠刷新您在会议上所做的任何更改:

session.save(user); 
session.flush(); 

B.使整个方法运行在交易 - 这是很多,当然更好。当提交事务时 - 只要手动完成,hibernate将刷新对数据库的任何更改。

例如:

Transaction tx = null; 

try { 

    session.beginTransaction(); 

    session.save(user); 
    .... 

    tx.commit(); 

} catch (RuntimeException e) { 
    tx.rollback(); 
    throw e; 
} 
0

如果您有一个请求多次DAO调用,然后session.getCurrentSession()是有用的,但我想这不是你的情况。 如果每个请求只有一个DAO调用,那么session.openSession()是正确的方法。

请注意,当使用session.openSession()时,您还必须关闭会话。

要做的最好的事情是为每个传入请求打开会话(使用过滤器是最简单的方法),然后在所有DAO中调用sessionFactory.getCurrentSession()以获取当前会话。我想你的问题是你没有指定过滤器。这样,所有的DAO将很容易重用,而且之后不需要关闭会话。

您可以在文档中发现了更多的信息: Hibernate documentation

0

我也面临着同样的问题,得到了解决。现在检查以下点 -

  1. 检查适当的jar文件使用的是
  2. 您在META-INF文件夹MANIFEST.MF应用信息。
  3. 在配置文件中检查您的hibernate配置以了解hibernate模板配置。
  4. 最后如果一切正常,请在插入前使用session.flush()

    Session session = sessionFactory.openSession(); 
    Transaction tx = session.beginTransaction(); 
        { 
         { 
          //... your logic 
          //flush a batch of inserts and release memory: 
          session.flush(); 
          session.clear(); 
         } 
        }

    tx.commit(); session.close()
+0

一切都在那里,但我仍然没有得到输出.. – user3189357 2014-09-25 10:54:28

+1

没有! hibernate conf肯定存在问题。你可以分享你的conf吗?细节? – 2014-09-25 11:13:23

+0

你能告诉我有没有必要在任何配置文件中添加jdbcimpl类的ref? – user3189357 2014-09-25 11:24:00

相关问题