2012-11-18 75 views
1

這是一個非常簡單的spring + hibernate示例。我在這裏做錯了什麼?Java spring +休眠接口(DAO)<bean>

DTO:

package com.xx.dto; 

import java.util.Date; 
import javax.persistence.*; 

@Entity 
@Table(name = "users") 
public class UserData { 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Integer id; 

    @Column(name = "user_firstname") 
    private String firstname; 

    @Column(name = "user_lastname") 
    private String lastname; 

    @Column(name = "user_sex") 
    private String sex; 

    @Column(name = "user_birthdate") 
    private Date birthDate; 

    @Column(name = "user_email") 
    private String email; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getFirstname() { 
     return firstname; 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 

    public String getLastname() { 
     return lastname; 
    } 

    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 

    public String getSex() { 
     return sex; 
    } 

    public void setSex(String sex) { 
     this.sex = sex; 
    } 

    public Date getBirthDate() { 
     return birthDate; 
    } 

    public void setBirthDate(Date birthDate) { 
     this.birthDate = birthDate; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 

DAO接口:

package com.xx.dao; 

import java.util.List; 
import com.provisori.dto.UserData; 

public interface UserDataDao { 

    void saveUser(UserData user); 

    void deleteUser(String key); 

    void updateUser(UserData user); 

    List<UserData> listUser(); 
} 

DAO實現:

package com.xx.imp; 

import java.util.List; 
import org.hibernate.Criteria; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.criterion.Restrictions; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.transaction.annotation.Transactional; 
import com.provisori.dao.UserDataDao; 
import com.provisori.dto.UserData; 

public class UserDataImp implements UserDataDao{ 

    @Autowired 
    SessionFactory sessionFactory; 

    @Transactional 
    @Override 
    public void saveUser(UserData user) { 
     sessionFactory.getCurrentSession().save(user); 
    } 

    @Transactional 
    @SuppressWarnings("unchecked") 
    @Override 
    public List<UserData> listUser() { 
     return sessionFactory.getCurrentSession() 
       .createCriteria(UserData.class).list(); 
    } 

    @Transactional 
    @Override 
    public void updateUser(UserData user) { 
     sessionFactory.getCurrentSession().update(user); 

    } 

    @Transactional 
    public UserData getUser(String key) { 
     Session session = sessionFactory.getCurrentSession(); 
     Criteria criteria = session.createCriteria(UserData.class); 
     criteria.add(Restrictions.eq("key", key)); 
     return (UserData) criteria.uniqueResult(); 
    } 

    @Transactional 
    @Override 
    public void deleteUser(String key) { 
     UserData user = getUser(key); 
     sessionFactory.getCurrentSession().delete(user); 
    } 
} 

spring.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" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <!-- Needed for Autowiring --> 
    <context:annotation-config /> 

    <!-- MySQL DataSource --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/xx" /> 
     <property name="user" value="root" /> 
     <property name="password" value="" /> 
    </bean> 

    <!-- Hibernate SessionFactory --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.provisori.dto.UserData</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <value> 
       hibernate.hbm2ddl.auto=update 
       hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
      </value> 
     </property> 
    </bean> 

    <!-- Transaction Management --> 
    <tx:annotation-driven transaction-manager="txManager" /> 
    <bean id="txManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <!-- Java Bean --> 
    <bean id="userDataDao" class="com.provisori.imp.UserDataImp" /> 

</beans> 

Main.class

package com.provisori.dto; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import com.provisori.dao.UserDataDao; 
import com.provisori.imp.UserDataImp; 

public class TestMain { 

    public static void main(String[] args) { 

     // Construct the spring application context 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 

     // Register hook to shutdown Spring gracefully 
     // See http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-shutdown 
     context.registerShutdownHook(); 

     // Get the business bean from context 
     UserDataDao dao = (UserDataImp) context.getBean("userDataDao"); 

     // Create simple property objects 
     UserData user = new UserData(); 
     user.setFirstname("firstnameTest"); 
     user.setLastname("lastnameTest"); 
     dao.saveUser(user); 
    } 
} 

結果

異常在線程 「主要」 java.lang.ClassCastException:$ Proxy13不能com.provisori.dto被轉換爲com.provisori.imp.UserDataImp 。 TestMain.main(TestMain.java:21)

+0

看來你修改了原來的問題,源代碼和你的問題。這不好,因爲答案已經不夠了。 –

+0

我更新了我對您發佈的新結果的回答。 –

回答

5

該錯誤是一個很好的指標—接口不能實例化。使用bean實現:

<bean id="userDataDao" class="com.provisori.imp.UserDataImp"> 
+0

Main:UserDataDao dao =(UserDataDao)context.getBean(「userDataDao」); spring.xml: Fawi

+0

@Fawi這就是我所說的。改變演員。你需要學習Java和Spring,因爲我認爲你不知道你在做什麼。 –

3

您無法實例化接口。

您的代碼:

<!-- Business Bean --> 
<bean id="userDataDao" class="com.provisori.dao.UserDataDao"> 
    <property name="userDataImp" ref="userDataImp" /> 
</bean> 
<bean id="userDataImp" class="com.provisori.imp.UserDataImp" /> 

您需要刪除第一個bean叫userDataDao。我建議閱讀Spring Docs,因爲您可能不知道/理解Spring IoC容器基礎知識。

文檔是你的朋友:READ

EDITED 後,你在你的問題修改後的源代碼,堆棧跟蹤:

您的代碼:

UserDataDao dao = (UserDataImp) context.getBean("userDataDao"); 

嘗試將其更改爲:

UserDataDao dao = (UserDataDao) context.getBean("userDataDao"); 

您當前的錯誤是由Spring生成的代理類引起的,它不是UserDataImp的子類,但它實現了相同的接口。所以它不能轉化爲具體的實現。相反,你需要用戶界面。

+0

如果我刪除了第一個名爲userDataDao的bean,那我該如何調用context.getBean(「userDataDao」); ?getBean(「userDataDao」)不存在 – Fawi

+0

您需要使用bean的名稱才能從應用程序上下文中獲取它。你正在改變你的問題的名稱,所以有可能我的答案的一部分不是最新的。您當前的代碼:''您使用了'userDataDao'這個名字。 –