【问题标题】:Spring + Hibernate + Maven org.hibernate.MappingException: AnnotationConfiguration instance is requiredSpring + Hibernate + Maven org.hibernate.MappingException:需要 AnnotationConfiguration 实例
【发布时间】:2014-12-13 00:28:15
【问题描述】:

我是 Spring 新手,所以我是 Hibernate 框架的新手。任务是创建一个具有前端和后端的项目,但现在我想专注于数据库连接。

我的 MySQL 服务器的本地主机上有 MySQL 数据库。有一个简单的应用程序需要创建客户、订单并在数据库中搜索它们,所以任务很简单。然而,我遇到了以下异常:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clientDAOImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory ee.st.running.dao.ClientDAOImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [config.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping class="ee.st.running.model.Client"/>    

我尝试了一些操作,在这里阅读了许多类似的问题,这导致我遇到了类似这样的其他异常。

我的 config.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
  <context:component-scan base-package=".*" />
 <tx:annotation-driven/>
  <context:annotation-config />
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/sqlconnection" />
    <property name="username" value="admin" />
    <property name="password" value="root" />
  </bean>


 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
     <property name="annotatedClasses">
            <list>
                <value>ee.st.running.model.Client</value>
                <value>ee.st.running.dao.ClientDAOImpl</value>
                <value>ee.st.running.model.Order</value>
                <value>ee.st.running.dao.OrderDAOImpl</value>
            </list>
        </property>
        <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
</property>
    <property name="hibernateProperties">
      <props>
        <prop
         key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        <prop key="hibernate.show_sql">true</prop>
      </props>

    </property>
  </bean>

  <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory">
  </bean>

  <bean id = "client" class = "ee.st.running.model.Client">
  <property name="clientDAO" ref = "ClientDAO"></property>
  </bean>

  <bean id = "clientDAO" class = "ee.st.running.dao.ClientDAOImpl">
  <property name="sessionFactory" ref = "sessionFactory"></property>
  </bean>


  <bean id = "order" class = "ee.st.running.model.Order">
  <property name="orderDAO" ref = "OrderDAO"></property>
  </bean>

      <bean id = "orderDAO" class = "ee.st.running.dao.OrderDAOImpl">
  <property name="sessionFactory" ref = "sessionFactory"></property>
  </bean>

  </beans>

这是项目结构:

这是我的 pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>ee.st.running.aktorstask</groupId>
  <artifactId>aktorstask</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <dependencies>
      <dependency>
            <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.3.2.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.3.1.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.3.0.ga</version>
    </dependency>


    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.0.6.RELEASE</version>
    </dependency> 

    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
          <version>4.0.6.RELEASE</version>
   </dependency>

    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>4.0.6.RELEASE</version>
    </dependency>

    <dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>

    <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>


    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
</dependencies>
<properties>
    <spring.version>3.2.3.RELEASE</spring.version>
</properties>  
</project>

还有课程: 客户

 package ee.st.running.model;

//import java.util.List;
//import java.util.Set;
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.Id;
//import javax.persistence.OneToMany;
  import javax.persistence.Table;
  import ee.st.running.dao.ClientDAOInterface;
  import ee.st.running.dao.ClientDAOImpl;

  @Entity
  @Table(name = "client")
  public class Client implements ClientInterface {


private Order o;
ClientDAOInterface ClientDAOInterface;

@Id
@GeneratedValue
 private int id;


@Column (name = "name")
 private String name;
@Column (name = "surename")
 private String surename;
 @Column (name = "address")
private String address;
 @Column (name = "phone_number")
private long phoneNumber;
 @Column (name = "id_code")
private long idCode;

//@OneToMany(mappedBy = «client», fetch = FetchType.LAZY)


public void makeorder() {
    o.newOrder();
}

// getters nd setters

public Order getO() {
    return o;
}


public void setO(Order o) {
    this.o = o;
}


public String getName() {
    return name;
}


public void setName(String name) {
    this.name = name;
}


public String getSurename() {
    return surename;
}


public void setSurename(String surename) {
    this.surename = surename;
}


public String getAddress() {
    return address;
}


public void setAddress(String address) {
    this.address = address;
}


public long getPhoneNumber() {
    return phoneNumber;
}


public void setPhoneNumber(int phoneNumber) {
    this.phoneNumber = phoneNumber;
}


public long getIdCode() {
    return idCode;
}


public void setIdCode(int idCode) {
    this.idCode = idCode;
}


// ctor 

public Client ()
{

}



public void setClientInfDAO (ClientDAOInterface ClientDAOInterface) 
{
    this.ClientDAOInterface = ClientDAOInterface;
}


public void save(Client client) {

    ClientDAOInterface.save(client);
}


public void update(Client client) {

    ClientDAOInterface.update(client);
}


public void remove(Client client) {

    ClientDAOInterface.remove(client);
}
}

客户端接口:

package ee.st.running.model;

public interface ClientInterface {
public void makeorder ();
public void save(Client client);
public void update (Client client);
public void remove (Client client);

}

ClientDAO接口:

package ee.st.running.dao;

import java.util.List;
import ee.st.running.model.Client;
public interface ClientDAOInterface {

public void removeClient (long id);
public List<Client> listClient();
public void save (Client client);
public void update (Client client);
public void remove (Client client);
}

ClientDAOImpl:

 package ee.st.running.dao;

 import java.util.List;
 import org.hibernate.SessionFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 import org.springframework.stereotype.Repository;
 import ee.st.running.model.Client;

@Repository
public class ClientDAOImpl extends HibernateDaoSupport implements ClientDAOInterface {


@Autowired
private SessionFactory sessionFactory;


public void AddClient(Client client) {
    sessionFactory.getCurrentSession().save(client);

}

public void removeClient(long id) {


    Client client = (Client) sessionFactory.getCurrentSession().load(Client.class, id);
    if (null != client) {
        sessionFactory.getCurrentSession().delete(client);
    }

}

@SuppressWarnings("unchecked")
public List<Client> listClient() {

    return sessionFactory.getCurrentSession().createQuery("from Client").list();
}

public void save(Client client) {
    sessionFactory.getCurrentSession().save(client);

}

public void update(Client client) {
    // TODO Auto-generated method stub

}

public void remove(Client client) {
    // TODO Auto-generated method stub

}   
}

最后是我的 hibernate.cfg:

 <?xml version='1.0' encoding='utf-8'?>
 <!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <mapping class="ee.st.running.model.Client" />
    <mapping class="ee.st.running.model.Order" />
</session-factory>
</hibernate-configuration>

我修改了几次,添加了一些额外的信息。我目前想要检查它是否有效,所以在 Main 类中我编写了原始代码来将信息存储到数据库并查看它是否实际存储,所以我可以继续:

package ee.st.running.aktorstask;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ee.st.running.dao.*;
import ee.st.running.model.*;
public class Main {

public static void main(String[] args) {

    ApplicationContext appContext = new ClassPathXmlApplicationContext ("./config.xml");

    Client clientx = (Client) appContext.getBean("client");
    Client client = new Client ();
    client.setName("Vasilij");
    client.setIdCode(389844455);
    client.setAddress("Pae 485 54 Tartu");
    client.setSurename("B");
    //client.makeorder();

    clientx.save(client);
    }
   }

它现在给了我映射异常 有什么想法,为什么?而且,顺便问一下,“AnnotationConfiguration 实例”是谁,它应该在哪里?

【问题讨论】:

    标签: java mysql spring hibernate maven


    【解决方案1】:

    普通的hibernate.cfg.xml使用Configuration类来构建Sessionfactory对象

      return new Configuration().configure().buildSessionFactory();
    

    您需要同样使用 AnnotationConfiguration。

    在上面的示例中,您已将 sessionFactory bean 中的类指定为

    <property name="annotatedClasses">
                <list>
                    <value>ee.st.running.model.Client</value>
                    <value>ee.st.running.dao.ClientDAOImpl</value>
                    <value>ee.st.running.model.Order</value>
                    <value>ee.st.running.dao.OrderDAOImpl</value>
                </list>
            </property>
    

    您在这里做的错误是您还添加了 DAO 类。 AnnotatedClasses 应该是领域类。 您可以删除它们并只保留客户和订单。

    其次,您还提供了 hibernate.cfg.xml 文件。因此,您可以在使用带注释的类时将其删除。

    因此最终代码可能如下所示:

    <property name="annotatedClasses">
                <list>
                    <value>ee.st.running.model.Client</value>
                    <value>ee.st.running.model.Order</value>
                </list>
            </property>
    

    并删除 hibernate.cfg.xml

    【讨论】:

    • 感谢您的回答!然而似乎还有另一个异常:“......嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建类路径资源 [config.xml] 中定义的名称为 'sessionFactory' 的 bean 时出错:调用 init 方法失败;嵌套异常是 java.io.FileNotFoundException:类路径资源 [hibernate.cfg.xml] 无法解析为 URL,因为它不存在”,从我的配置中删除“”后,我又多了一个:
    • "java.lang.NoSuchMethodError: org.hibernate.cfg.Configuration.addAnnotatedClass(Ljava/lang/Class;)Lorg/hibernate/cfg/Configuration;"像这样..
    • 根据stackoverflow.com/questions/14958708/…,我将休眠版本更新为 3.6.0.Final,但它再次返回错误“嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 bean 时出错在类路径资源 [config.xml] 中定义的名称“sessionFactory”:调用 init 方法失败;嵌套异常是 java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/MetadataProvider"
    • 尝试将您的hibernate-commons-annotations 版本更改为最新版本:4.0.5.Final。此外,最新版本的 Hibernate 是 4.3.6.Final,以防您想更新。
    • 试过了,但它给出了“缺少工件 javax.transaction:jta:jar:1.0.1B”。目前我下载了 jar,但它不想安装在 Maver Repository 文件夹中..
    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多