【问题标题】:Java spring + hibernate interface (DAO) <bean>Java spring + hibernate 接口 (DAO) <bean>
【发布时间】:2012-11-18 21:32:06
【问题描述】:

这是一个非常简单的 spring + hibernate 例子。我在这里做错了什么?

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>

主类

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.imp.UserDataImp 在 com.provisori.dto.TestMain.main(TestMain.java:21)

【问题讨论】:

  • 看来你修改了原来的问题,源代码和你的问题。这不好,因为答案不再足够。
  • 我更新了对您发布的新结果的回答。

标签: java spring hibernate


【解决方案1】:

错误是一个很好的指标——接口不能被实例化。使用 bean 实现:

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

【讨论】:

  • 主要:UserDataDao dao = (UserDataDao) context.getBean("userDataDao"); spring.xml:
  • @Fawi 这就是我的建议。换演员。您需要学习 Java 和 Spring,因为我认为您不知道自己在做什么。
【解决方案2】:

你不能实例化接口。

您的代码:

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

您需要删除第一个名为userDataDao 的bean。我建议您阅读 Spring Docs,因为您可能不了解/了解 Spring IoC 容器基础知识。

文档是你的朋友:READ

已编辑更改源代码后,您的问题中的堆栈跟踪:

您的代码:

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

尝试将其更改为:

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

您当前的错误是由 Spring 生成的代理类引起的,该代理类不是 UserDataImp 的子类,但它实现了相同的接口。所以它不能被投射到你的具体实现中。相反,您需要用户界面。

【讨论】:

  • 如果我删除了第一个名为 userDataDao 的 bean,那么我该如何调用 context.getBean("userDataDao"); ? getBean("userDataDao") 不存在
  • 您需要使用 bean 的名称从应用程序上下文中获取它。您正在更改问题中的名称,因此我的部分答案可能不是最新的。您当前的代码:&lt;bean id="userDataDao" class="com.provisori.imp.UserDataImp" /&gt; 您使用的名称为 userDataDao
猜你喜欢
  • 2012-06-01
  • 2020-06-25
  • 2011-01-27
  • 2010-12-07
  • 2011-05-06
  • 2012-02-14
  • 2018-01-10
  • 2012-06-10
  • 1970-01-01
相关资源
最近更新 更多