2014-09-25 103 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

相關問題