Click here to Skip to main content
15,881,709 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am new to spring and hibernate. I have created a spring-mvc app with hibernate integration and when I run the code I get the below given error. My requirement is to pick the relevant path from the advertisement given the customer category. This involves two tables respectively along with the 3rd table for many-many mapping.

Java
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernate3AnnotatedSessionFactory' defined in ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: customercategory, for columns: [org.hibernate.mapping.Column(advertisements)]
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:706)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2476)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2465)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)


Below is my model class Advertisement

Java
@Entity
@Table(name = "advertisement")
public class Advertisement {

@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

private String path;

private String name;

public int getId(){
    return id;
}

public String getName()
{
    return name;
}

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

public String getPath()
{
    return path;
}

public void setPath()
{
    this.path=path;
}

}


below is another model customercategory

Java
@Entity
@Table(name = "customercategory")
public class CustomerCategory {

@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

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

private Set advertisements;

public int getId()
{
    return id;
}

public String getName()
{
    return name;
}

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

public Set getAdvertisements()
{
    return advertisements;
}

public void setAdvertisements(Set advertisements)
{
    this.advertisements=advertisements;
}

}


Below is my DAO class in which im trying to run a query that needs information from a many-many table.

Java
public class CustomerCategoryDAOImpl implements CustomerCategoryDAO {

private SessionFactory sessionFactory;

private int catId;

private String adPath;

public void setSessionFactory(SessionFactory sessionFactory)
{
    this.sessionFactory=sessionFactory;
}

@Override
public String getAdPath(String categoryName) {

    sessionFactory = new Configuration()
            .addResource("com/springapp/mvc/CustomerCategory.hbm.xml")
            .buildSessionFactory();

    Session session=this.sessionFactory.openSession();
    session.beginTransaction();

    Query query=session.createQuery("from CustomerCategory where name=:categoryName");
    query.setParameter("name",categoryName);

    for(Iterator it=query.iterate();it.hasNext();)
    {
        CustomerCategory c=(CustomerCategory)it.next();
        catId=c.getId();

        Set advertisements=c.getAdvertisements();

        for(Iterator it2=advertisements.iterator();it2.hasNext();)
        {
            Advertisement ad=(Advertisement)it2.next();
            adPath=ad.getPath();
        }
    }
    session.getTransaction().commit();
    session.close();
    return adPath;
}
}

below is my controller class that responds to the url request.

Java
@Controller
@RequestMapping(value = "/{category}", method = RequestMethod.GET)
public class HelloController {
@RequestMapping(method = RequestMethod.GET)
public void printWelcome(@PathVariable("category") String categoryName,
                           @RequestParam("value") String value,HttpServletResponse response) {

    ApplicationContext context = new FileSystemXmlApplicationContext
            ("classpath:/../mvc-dispatcher-servlet.xml");

    CustomerCategoryDAO cDAO=context.getBean(CustomerCategoryDAO.class);

    String path = cDAO.getAdPath(value);

    try {

        //Get path to ad for the categoryName from the database
            File adFile = new File(path);
            // get your file as InputStream
            InputStream is = FileUtils.openInputStream(adFile);
            // copy it to response's OutputStream
            org.apache.commons.io.IOUtils.copy(is, response.getOutputStream());
            response.flushBuffer();

    } catch (IOException ex) {
        throw new RuntimeException("IOError writing file to output stream");
    }
}


}


Below is my dispatcher xml.

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

<context:component-scan base-package="com.springapp.mvc"/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<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/ccas" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>

<bean id="hibernate3AnnotatedSessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>
            <value>com.springapp.mvc.CustomerCategory</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
</bean>

<bean id="customerCategoryDAO" class="com.springapp.mvc.CustomerCategoryDAOImpl">
    <property name="sessionFactory" ref="hibernate3AnnotatedSessionFactory" />
</bean>


and below is my hibernate xml.

Java
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.springapp.mvc">
<class name="CustomerCategory" table="customercategory">
    <meta attribute="class-description">
        This class contains the customer category detail.
    </meta>
    <id name="id" type="int" column="id">
        <generator class="native"/>
    </id>
    <set name="advertisements" cascade="save-update" table="customercategory_has_advertisement">
        <key column="customerCategory_id"/>
        <many-to-many column="advertisement_id" class="Advertisement"/>
    </set>
    <property name="name" column="name" type="string"/>
</class>

<class name="Advertisement" table="advertisement">
    <meta attribute="class-description">
        This class contains the advertisement records.
    </meta>
    <id name="id" type="int" column="id">
        <generator class="native"/>
    </id>
    <property name="name" column="name" type="string"/>
    <property name="path" column="path" type="string"/>
</class>
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900