2009-07-10 68 views
0

嗨,這是我第一次使用spring和hibernate的應用程序。所以請耐心等待我的愚蠢問題:)。 我在netbeans 6.7中創建了一個簡單的java應用程序。 這裏是我的daos接口 UsersDAO使用Spring DAO和Hibernate的數據訪問層

package Dao; 

import Entities.Users; 

public interface UsersDAO { 
    public Long GetIdByUsernameAndPasswor(String username, String password); 
    public Users GetAllByID(Long id); 
    public boolean Create(Users user); 
    public boolean Delete(Users user); 
    public boolean Edit(Users user); 
} 

和的ContactDAO

package Dao; 

import Entities.Contacts; 
import java.util.List; 

public interface ContactsDAO { 
    public List GetAll(); 
    public Contacts GetAllById(Long Id); 
    public boolean Create(Contacts contact); 
    public boolean Delete(Contacts contact); 
    public boolean Edit(Contacts contact); 
} 

及其實現

package Dao.DaoImpl; 

import Dao.UsersDAO; 
import Entities.Users; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.springframework.dao.support.DataAccessUtils; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 

public class UserDAOImpl extends HibernateDaoSupport implements UsersDAO { 
    // private SessionFactory sessionFactory; 
    public UserDAOImpl(){} 

    public Long GetIdByUsernameAndPasswor(String username, String password) 
    { 
     try 
     { 
      return DataAccessUtils.longResult(getHibernateTemplate().find("select u.user_id from Users u where u.username=? and u.password", new Object[] {username, password})); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return Long.parseLong("0"); 
     } 
    } 

    public Users GetAllByID(Long id) { 
     try 
     { 
      return (Users) getHibernateTemplate().get(Users.class, id); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return new Users(); 
     } 
    } 

    public boolean Create(Users user) { 
     try 
     { 
      getHibernateTemplate().save(user); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return false; 
     } 
    } 

    public boolean Delete(Users user) { 
     try 
     { 
      getHibernateTemplate().delete(user); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return false; 
     } 
    } 

    public boolean Edit(Users user) { 
     try 
     { 
      getHibernateTemplate().saveOrUpdate(user); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return false; 
     } 
     } 
    } 

package Dao.DaoImpl; 

import Dao.ContactsDAO; 
import Entities.Contacts; 
import java.util.List; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 

public class ContactsDAOImpl extends HibernateDaoSupport implements ContactsDAO{ 
    public ContactsDAOImpl(){} 

    public List GetAll() { 
     try 
     { 
      return getHibernateTemplate().find("from Contacts"); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

    public Contacts GetAllById(Long Id) { 
     return (Contacts) getHibernateTemplate().get(Contacts.class, Id); 
    } 

    public boolean Create(Contacts contact) { 
     try 
     { 
      getHibernateTemplate().save(contact); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return false; 
     } 
    } 

    public boolean Delete(Contacts contact) { 

     try 
     { 
      getHibernateTemplate().delete(contact); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return false; 
     } 
    } 

    public boolean Edit(Contacts contact) { 

     try 
     { 
      getHibernateTemplate().saveOrUpdate(contact); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return false; 
     } 
     } 
    } 

我的spring配置網絡連接文件是文件夾Resources.so通常路徑是Resouces/contactmanagement.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 

    <property name="url" value="jdbc:mysql://localhost:3306/ContactsMan" /> 
    <property name="username" value="root" /> 
    <property name="password" value="letmein" /> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.SessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="mappingResouces"> 
     <list> 
      <value>Resources/users.hbm.xml</value> 
      <value>Resources/contacts.hbm.xml</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 
<bean id="usersdao" class="Dao.DaoImpl.UserDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactory"> 
</bean> 
<bean id="contactsdao" class="Dao.DaoImpl.ContactDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 
</beans> 

映射文件是相同的資源文件夾下下users.hbm.xml contacts.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
    <hibernate-mapping> 
     <class name="Entities.Contacts" table="contacts"> 
      <id name="contact_id"> 
        <generator class="increment"/> 
      </id> 
      <many-to-one cascade="" class="Users" name="user"/> 
      <property name="firstname" /> 
      <property name="lasstname" /> 
      <property name="cellphone1" /> 
      <property name="cellphone2" /> 
      <property name="telephone" /> 
      <property name="email" /> 
     </class> 
    </hibernate-mapping> 

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
    <hibernate-mapping> 
     <class name="Entities.Users" table="users"> 
      <id name="users_id"> 
       <generator class="increment"/> 
      </id> 
      <bag name="contacts" inverse="true" lazy="true"> 
       <key column="user_id"/> 
       <one-to-many class="Contacts"/> 
      </bag> 

      <property name="username"/> 
      <property name="passsword"/> 
      <property name="city"/> 
      <property name="country"/> 

     </class> 
    </hibernate-mapping> 

這是我的最後的主類

package main; 
import Dao.UsersDAO; 
import Entities.Users; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext 
public class contactmanagement { 

public static void main(String[] args) 
{ 
    ApplicationContext ctx = new ClassPathXmlApplicationContext("Resources/contactmanagement.xml"); 
    UsersDAO usersdao = (UsersDAO) ctx.getBean("usersdao"); 
    Users user = new Users(); 
    user.setUsername("me"); 
    user.setPassword("mypass"); 
    user.setCity("somecity"); 
    user.setCountry("somecountry"); 

    usersdao.Create(user); 
    System.out.println("created"); 
} 

當我運行這個它說要給出一個總結「沒有名爲'usersdao'的bean被定義爲」 請問我做錯了什麼? 這裏是關於DAO實現類的另一個問題。我應該設置屬性setSessionFactory?或者通過getHibernateTemplate()來處理每一件事情? 請讓我通過this.Thanks閱讀。我知道這是很長的;)

+0

你的格式是一團糟。我甚至不會去嘗試閱讀。 – skaffman 2009-07-10 15:24:41

+0

修復格式,我們來看看。 – 2009-07-10 15:29:04

回答

0

你的格式是非常糟糕的,所以我沒有真的通過你的整個問題,但我沒有注意到,你沒有關閉您property標籤瀏覽:

<bean id="usersdao" class="Dao.DaoImpl.UserDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactory"> 
</bean> 

它應該是:

<bean id="usersdao" class="Dao.DaoImpl.UserDAOImpl"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
+0

抱歉的formating.I've糾正。感謝您的回覆 – 2009-07-10 15:37:01

+0

您是否嘗試修復您的Spring配置文件?問題仍然存在嗎? – 2009-07-10 15:59:36

0

的幾個注意事項,雖然我沒有回答你的問題 -

你沒有使用你的接口。你有UsersDAO和一個UsersDAOImpl,但是Impl和界面沒有任何關係,因爲你省略了「implements UsersDAO」。不過,這應該不會影響彈簧初始化。 (編輯 - 沒關係,它在類之上,沒有看到它 - 然而,你只是創建一個bean並在春天使用它 - 你並不需要這裏的接口)。

通常當我看到這個錯誤是因爲要麼a)拼寫錯誤的bean名稱,所以沒有這樣的bean(你沒有做過)或b)因爲bean不能被實例化原因。你能發佈完整的堆棧跟蹤嗎?

+0

Jul 10,2009 3:39:54 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO:Refreshing org[email protected]133f1d7:display name [org.springframework.context.support.ClassPathXmlApplicationContext @ 133f1d7];啓動日期[週五7月10日15:39:53 GMT 2009];上下文層次結構的根 2009年7月10日上午3時39分54秒org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息:從類路徑資源[Resources/contactmanagement.xml] – 2009-07-10 15:52:12

+0

裝載XML bean定義2009年7月10日3:39:54 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory INFO:應用程序上下文的Bean工廠[org.springframework.context。[email protected]]:org.s[email protected]11ddcde Jul 10,2009 3:39:55 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO:預先實例化單例在org.s[email protected]11ddcde:定義beans [];工廠層次結構的根 – 2009-07-10 15:52:46

0

使用

context.getBeansOfType(UserDaoImpl.class); 

context.getBeansOfType(UserDao.class); 

,以確保有沒有錯別字嘗試。

0

每次更改配置文件之後,清理並重建項目也是值得的,以確保它們實際上已移至編譯類並在運行應用程序時使用。

2

我可以建議看看使用Spring Annotations嗎?我並不是想讓你先弄清楚另一件事情,但一旦掌握了它,它就會比讓所有配置和映射文件一起工作更容易。

有一個在章節3.11和3.12這裏對此一些非常詳細的信息: Spring Documentation Chapter 3. The IoC container 但它basicly歸結爲是這樣的:

  • 你註釋你要定義爲使用豆類DAO類@存儲庫(或@Service)。
  • 無論你需要使用這樣一個DAO你在你的類中聲明一個字段:@Autowired MyExampleDAO myDao; (這些類本身也應該使用@Service註釋以使其可以工作(或者有另一種方式,任何人?))
  • 配置Spring以查找這些註釋,並且它將使其始終爲您的bean實現只要你需要它。

作爲一個例子,我的整個彈簧配置看起來像這樣:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 

    <context:component-scan base-package="org.path.to.your.base.package" /> 

    <!-- Transaction Manager --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
    <tx:annotation-driven /> 

    <!-- Session Factory --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="configLocation" value="hibernate.cfg.xml" /> 
    </bean> 
</beans> 

和樣品DAO看起來像這樣:

@Repository 
public class UserHibDAO extends GenericHibernateDAO<HopeUser> implements UserDAO { 
    public IUser findByName(String name) { 
     return (User) createCriteria(Restrictions.naturalId().set("name", name)).uniqueResult(); 
    } 
} 

並使用該DAO看起來像這樣:

@Service 
public class Installer { 
    private static final Logger log = Logger.getLogger(Installer.class); 

    public static void main(String[] args) throws Exception { 
     Installer inst = (Installer) SpringUtil.getContext().getBean("installer"); 
     inst. storeUsers(); 
     log.info("Done"); 
    } 

@Autowired 
private UserDAO userdao; 

@Transactional 
public void storeUsers() { 
    userdao.makePersistent(new User("Tim")); 

    log.info("Users stored"); 
} 
} 

請特別注意看主要方法最後一個代碼示例:這是您必須使用的而不是新的Installer()來完成自動裝配工作。

希望這個例子能夠幫助你,無論如何,我意識到它不是對你的問題的直接回答,而是對手頭問題的另一種解決方案。

0

這是一個在黑暗中拍攝的照片,但請嘗試在Netbeans上進行清理和構建。自動幕後編譯不會更新.War文件中的XML。

0

大家好,非常感謝您幫助我解決問題。我實際上是通過查看堆棧消息來解決問題,並糾正了大部分時間在hbm文件中輸入錯誤和錯誤引用以及修正了大小寫敏感在pojo中的屬性。並且我也沒有在任何daos中創建sessionFactory屬性。 現在很好,我說我的第一個問題。雖然大多數的crud函數工作我仍然有問題在返回用戶對象,而不是列表。當然基於ID,我用個getHibernateTemplate.get(Users.class, id)

,但我想返回實現從ArrayList的一個簡單的投給用戶一流是不可能在這裏後,用戶通過用戶名對象是我做的

public Users GetUserByUsername(String username) { 
    try 
    { 
     List userdetails = getHibernateTemplate().find("select u.user_id, u.username, u.password, u.city, u.country from Users u where u.username=?",username); 
     Users u = new Users(); 
     u.setUser_id(Integer.parseInt(userdetails.get(0).toString())); 
     u.setUsername(userdetails.get(1).toString()); 
     u.setPassword(userdetails.get(2).toString()); 
     u.setCity(userdetails.get(3).toString()); 
     u.setCountry(userdetails.get(4).toString()); 
    return u; 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
     return new Users(); 
    } 

它不工作。我猜想,也許它不會返回列,這就是爲什麼我改變了查詢從「用戶你u.username =?」到上面的那個。

1如何從該查詢返回一個用戶對象? 2如何返回用戶對象列表?

另一件讓我擔心的事情是如何爲特定用戶保存聯繫人。您可以從我的映射文件中注意到,我的表聯繫人通過引用user_id(它是Users表中的主鍵)來保持關係。在爲contactdaoimpl編寫單元測試時,我遇到了一些問題。因爲您都知道聯繫pojo中有用戶類的屬性。然後保存id 2的聯繫人,例如我應該這樣做?

Users u = new Users(); 
u.setUser_id(2); //supposing i have a way to get the id of the user 
Contacts c = new Contacts(); 
c.setUser(u); 
c.setFirtname("young");// an so on for the rest of the properties 
contactdao.save(c); 

如果這是正確的,所以在測試類中,我將不得不intanctiate都userdao和contactdao。 3那很好嗎? 我有這樣的感覺,即測試不是隻與用戶有依賴關係,但我仍然對解耦他們沒有任何意見,我甚至不知道我應該這樣做。 這樣就可以了。一旦這三種煩惱都被清除了,我就會成功地完成一個基本的功能應用程序,並且會在春季休眠。我想在這之後,我會用它來發佈教程某處。感謝您的閱讀和幫助

1

首先,您需要在兩個DAO中創建sessionFactory的setter,因爲您必須在contactmanagement.xml的兩個bean(UserDAO和ContectDAO)中注入sessionfactory。

另一種替代方法是,您可以在您的DAO中使用HibernateTemplete。

例如:

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate.Hibernate Template"> 
     <property name="sessionFactory"><ref bean="sessionFactory"/></property> 
</bean> 

然後創建在兩者(DAO中)的HibernateTemplate的設定器。您可以使用 hibernateTemplate.save(); hibernateTemplate.saveOrUpdate(); hibernateTemplate.delete(); hibernateTemplate.find();
etc .....