i am using netbeans 7.2, postgres sql,jpa2,hibernate 4.2.
i just created a new maven simple java project(not webapp).
However i have done setup hibernate and jpa,but autowire "wpService" get null(not sure is it caused by hibernate configuration).
here is my project file(innovax.rar), if you would like to test it.
https://skydrive.live.com/#cid=837EF1FA9A4C06AE&id=837EF1FA9A4C06AE%21130
my main class
package sg.com.innovax.Twitter;
import java.io.IOException;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import sg.com.innovax.Twitter.DBObject.service.impl.wall_postServiceImpl;
import sg.com.innovax.Twitter.DBObject.service.wall_postService;
import twitter4j.*;
public final class twitter {
public static void main(String[] args) throws TwitterException {
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
test a = new test();
}
}
my test instance
import org.springframework.beans.factory.annotation.Autowired;
import sg.com.innovax.Twitter.DBObject.service.wall_postService;
/**
*
* #author Nimamakaho
*/
public class test {
#Autowired
private wall_postService wpService;
test(){
// wpService is null when i break point here
System.out.println("Asd");
}
}
my wall post object
package sg.com.innovax.Twitter.DBObject;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.util.Formatter;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
#Entity
#Table(name = "wall_post")
#NamedQueries({
#NamedQuery(name="wall_post.findById", query="select wp from wall_post wp where wp.id = :id")
// #NamedQuery(name="wall_post.getByHashtagsRecords", query="select wp.*,case when wpa.id is null then false else true end as ack from (select wp from wall_post wp where wp.id in (:id) ) as wp LEFT JOIN wall_post_acknowledgement wpa on wp.id = wpa.wall_post_id")
})
public class wall_post {
#Id
#SequenceGenerator(name="wall_post_id_seq", sequenceName="wall_post_id_seq", allocationSize=1)
#GeneratedValue(strategy=GenerationType.SEQUENCE, generator="wall_post_id_seq")
#Basic(optional = false)
private int id;
private String title;
private String message;
private boolean enable_acknowledgement;
private boolean enable_comment;
private Timestamp created_time;
private Timestamp edited_time;
private Timestamp deleted_time;
private Timestamp last_updated;
public Timestamp getLast_updated() {
return last_updated;
}
public void setLast_updated(Timestamp last_updated) {
this.last_updated = last_updated;
}
private int user_id;
public boolean isEnable_comment() {
return enable_comment;
}
public void setEnable_comment(boolean enable_comment) {
this.enable_comment = enable_comment;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isEnable_acknowledgement() {
return enable_acknowledgement;
}
public void setEnable_acknowledgement(boolean enable_acknowledgement) {
this.enable_acknowledgement = enable_acknowledgement;
}
public Timestamp getCreated_time() {
return created_time;
}
public void setCreated_time(Timestamp created_time) {
this.created_time = created_time;
}
public Timestamp getEdited_time() {
return edited_time;
}
public void setEdited_time(Timestamp edited_time) {
this.edited_time = edited_time;
}
public Timestamp getDeleted_time() {
return deleted_time;
}
public void setDeleted_time(Timestamp deleted_time) {
this.deleted_time = deleted_time;
}
}
my wall post service
package sg.com.innovax.Twitter.DBObject.service;
import java.util.List;
import sg.com.innovax.Twitter.DBObject.*;
public interface wall_postService {
public wall_post findById(Integer id);
public boolean isAuthorizeToAccess(int wallPostID,int userid);
}
my wall post service impl
package sg.com.innovax.Twitter.DBObject.service.impl;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import javax.annotation.Resource;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.SQLQuery;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.cfg.Configuration;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import sg.com.innovax.Twitter.DBObject.*;
import sg.com.innovax.Twitter.DBObject.service.wall_postService;
#Service
#Repository
public class wall_postServiceImpl implements wall_postService {
private static final Logger logger = LoggerFactory.getLogger(wall_postServiceImpl.class);
#PersistenceContext
private EntityManager em;
private EntityManagerFactory emf;
#Override
public wall_post findById(Integer id) {
try{
if(id == null) return null;
TypedQuery<wall_post> query = em.createNamedQuery("wall_post.findById", wall_post.class);
query.setParameter("id", id);
return query.getSingleResult();
}catch(NoResultException ex)
{
return null;
}
catch(Exception ex)
{
logger.error("=================================================");
logger.error("findById()",ex);
return null;
}
}
public boolean isAuthorizeToAccess(int wallPostID,int userid) {
try
{
String sql =
" select wall_post_id from wall_post_authority where group_id in "+
" (select group_id from group_user where user_id = :userid group by group_id) "+
" and wall_post_id = :wallPostID group by wall_post_id ";
Query query = em.createNativeQuery(sql).setParameter("userid", userid).setParameter("wallPostID", wallPostID);
Object a = query.getSingleResult();
return true;
}catch(NoResultException ex)
{
return false;
}
catch(Exception ex)
{
logger.error("=================================================");
logger.error("isAuthorizeToAccess()",ex);
return false;
}
}
}
my application context 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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.2.xsd">
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:postgresql://127.0.0.1:5432/testspring" />
<property name="username" value="postgres" />
<property name="password" value="admin" />
</bean>
<!-- Database
<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/test" />
<property name="username" value="root" />
<property name="password" value="admin" />
</bean>
-->
<!-- Entity Manager -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="POSTGRESQL" />
</bean>
</property>
<property name="packagesToScan" value="sg.com.innovax" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- Transaction Manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- Jpa Repositories -->
<jpa:repositories base-package="sg.com.innovax.Twitter"></jpa:repositories>
</beans>
here is my pom file
<?xml version="1.0" encoding="UTF-8"?>
<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>sg.com.innovax</groupId>
<artifactId>innovax</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<org.springframework-version>3.2.3.RELEASE</org.springframework-version>
<org.springjpa-version>1.3.2.RELEASE</org.springjpa-version>
</properties>
<dependencies>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-core</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-stream</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.1.9.Final</version>
</dependency>
<!-- Additional Analyzers: -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-analyzers</artifactId>
<version>4.2.0.Final</version>
</dependency>
<!-- Infinispan integration: -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-infinispan</artifactId>
<version>4.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901.jdbc4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.22</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.170</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${org.springjpa-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
AFAIK you cannot autowire a static field. Try it as an instance member and see if that solves your problem.
try to create a setter method for ur private field , and place the autowire annotation on the method like this:
private wall_postService wpService;
#Autowired
public void setwpService(wall_postService wpService){
this.wpService = wpService ;
}
and now use the method in the test class ...
Related
I am trying to create project with restful web services.I am getting an error
org.hibernate.hql.internal.ast.QuerySyntaxException: Website is not
mapped
.I have tried each solution to solve this error.Please review my code and let me know if there is any suggestion.Thank You
GifController:
package com.gif.code.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.gif.code.model.GifModel;
import com.gif.code.service.GifService;
#RestController
public class GifController {
#Autowired
GifService gifService;
#RequestMapping(value = "/getAllData", method = RequestMethod.GET, headers = "Accept=application/json")
public List<GifModel> getData() {
System.out.println("In Controller");
List<GifModel> listOfData = gifService.getAllData();
return listOfData;
}
#RequestMapping(value = "/getData/{id}", method = RequestMethod.GET, headers = "Accept=application/json")
public GifModel getDataById(#PathVariable int id) {
return gifService.getData(id);
}
#RequestMapping(value = "/addData", method = RequestMethod.POST, headers = "Accept=application/json")
public void addData(#RequestBody GifModel gifModel) {
gifService.addData(gifModel);
}
}
GifModel:
package com.gif.code.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
#Entity
#Table(name="WEBSITE")
public class GifModel {
#Id
#Column(name="id")
#GeneratedValue(strategy=GenerationType.IDENTITY)
int id;
#Column(name="title")
String title;
#Column(name="description")
String description;
public GifModel() {
super();
}
public GifModel(int i, String title,String description) {
super();
this.id = i;
this.title = title;
this.description=description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
GifService:
package com.gif.code.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.gif.code.dao.GifDao;
import com.gif.code.model.GifModel;
#Service("gifService")
public class GifService {
#Autowired
GifDao gifDao;
#Transactional
public List<GifModel> getAllData() {
System.out.println("In Service");
return gifDao.getAllData();
}
#Transactional
public GifModel getData(int id) {
return gifDao.getData(id);
}
#Transactional
public void addData(GifModel gifmodel) {
gifDao.addData(gifmodel);
}
}
GifDao:
package com.gif.code.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.gif.code.model.GifModel;
#Repository
public class GifDao {
#Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sf) {
this.sessionFactory = sf;
}
#SuppressWarnings("unchecked")
public List<GifModel> getAllData() {
System.out.println("In Dao");
Session session = this.sessionFactory.getCurrentSession();
List<GifModel> textList = session.createQuery("from Website").list();
return textList;
}
public GifModel getData(int id) {
Session session = this.sessionFactory.getCurrentSession();
GifModel gifmodel = (GifModel) session.load(GifModel.class, new Integer(id));
return gifmodel;
}
public GifModel addData(GifModel gifmodel) {
Session session = this.sessionFactory.getCurrentSession();
session.persist(gifmodel);
return gifmodel;
}
}
Spring-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
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
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<annotation-driven />
<resources mapping="/resources/**" location="/resources/" />
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url"
value="jdbc:mysql://localhost:3306/gifdata" />
<beans:property name="username" value="root" />
<beans:property name="password" value="Chirpn123" />
</beans:bean>
<!-- Hibernate 4 SessionFactory Bean definition -->
<beans:bean id="hibernate4AnnotatedSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="annotatedClasses">
<beans:list>
<beans:value>com.gif.code.model.GifModel</beans:value>
</beans:list>
</beans:property>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<context:component-scan base-package="com.gif.code" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</beans:bean>
</beans: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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gif.code</groupId>
<artifactId>Gif</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Gif Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.0.RELEASE</version>
</dependency> -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.1</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- Apache Commons DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
<build>
<finalName>Gif</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<spring.version>4.2.1.RELEASE</spring.version>
<security.version>4.0.3.RELEASE</security.version>
<jdk.version>1.7</jdk.version>
<hibernate.version>4.3.5.Final</hibernate.version>
<org.aspectj-version>1.7.4</org.aspectj-version>
</properties>
</project>
HQL works with the class names not with table names!
So you have to write:
List<GifModel> textList = session.createQuery("from GifModel").list();
I'm trying to connect a web app (using Spring MVC and Eclipse Java EE IDE) to a database (using MySQL).
I've configured the connection (at uni we are using Hibernate) like this (Location: Java resources > src/main/resources):
<?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:context="http: / / www.springframework.org/schema/context"
xmlns:mvc="http ://www.springframework.org/schema/mvc" xmlns:tx="http ://www.springframework.org/schema/tx"
xsi:schemaLocation="http ://www.springframework.org/schema/beans
http ://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http ://www.springframework.org/schema/context
http ://www.springframework.org/schema/context/spring-context-4.2.xsd
http ://www.springframework.org/schema/mvc
http ://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http ://www.springframework.org/schema/tx
http ://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- Properties -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.validator.apply_to_ddl">false</prop>
<prop key="hibernate.validator.autoregister_listeners">false</prop>
<!--<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
<!-- Mappings -->
<property name="packagesToScan">
<list>
<value>ar.edu.grupoesfera.cursospring.model</value>
</list>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:// localhost:(port)/ my_database" />
<property name="username" value="root" />
<property name="password" value="root" />
<!-- <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:db_aplicacion" />
<property name="username" value="sa" />
<property name="password" value="" /> -->
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
(The commented parts are there because at first we were working in memory, but now we have to connect to the database).
I did the same for test-hibernateContext.xml in src/test/resources.
This is the 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>Project</groupId>
<artifactId>Project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>2.4.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.6.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.19.0-GA</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
</project>
When I change all that configuration, the project runs perfectly fine... but after I add annotations in one of the classes of the project (Product), the app stops running.
Here is the Product.class:
package ar.edu.grupoesfera.cursospring.model;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.springframework.web.multipart.MultipartFile;
#Entity
#Table (name = "Product")
public class Product implements Comparable<Product>{
#Id
#Column (name = "Id_Product")
private Integer id;
#Column (name = "Nom_Product")
private String nameProduct;
#Column (name = "Desc_Product")
private String description;
#OneToOne
#JoinColumn(name = "idColor")
private Color color;
#OneToOne
#JoinColumn(name = "idSize")
private Size size;
#Column (name = "Price_Product")
private Float price;
#OneToOne
#JoinColumn(name = "idCategory")
private Category category;
#Column (name = "Img_Product")
private MultipartFile imgproduct;
#Column (name = "Name_Img_Product")
private String nameimg;
#Column (name = "New_Product")
private String newP;
public Integer getId() {
return id;
}
public Integer setId(Integer id) {
return this.id = id;
}
public String getNameProduct() {
return NameProduct;
}
public void setNameProduct(String nameProduct) {
this.nameProducto = nameProduct;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public Size getSize() {
return size;
}
public void setTalle(Talle talle) {
this.talle = talle;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public MultipartFile getImgproduct() {
return imgproduct;
}
public void setImgproduct(MultipartFile imgproduct) {
this.imgproduct = imgproduct;
}
public String getNameimg() {
return nameimg;
}
public void setNameimg(String nameimg) {
this.nameimg = nameimg;
}
public String getNew() {
return new;
}
public void setNewP(String newP) {
this.newP = newP;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
#Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
#Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Product other = (Product) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
#Override
public int compareTo(Product o) {
return this.id.compareTo(o.id);
}
}
Any idea if just adding these annotations is what may be causing that I can't run the app? (it gives error 404) I mean.. there has to be some way, because I obviously need them to continue with the database, but I've been researching and I have no idea what's going on.
Note: I still don't have anything in dao package.
Edit: This is the controller for that particular class (I have many) and that part of the project:
package ar.edu.grupoesfera.cursospring.controladores;
import javax.inject.Inject;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import ar.edu.grupoesfera.cursospring.modelo.Categoria;
import ar.edu.grupoesfera.cursospring.modelo.ColeccionCategoria;
import ar.edu.grupoesfera.cursospring.modelo.ColeccionColor;
//import ar.edu.grupoesfera.cursospring.modelo.ColeccionProducto;
import ar.edu.grupoesfera.cursospring.modelo.ColeccionTalle;
import ar.edu.grupoesfera.cursospring.modelo.Color;
import ar.edu.grupoesfera.cursospring.modelo.Producto;
//import ar.edu.grupoesfera.cursospring.modelo.Stock;
import ar.edu.grupoesfera.cursospring.modelo.Talle;
import ar.edu.grupoesfera.cursospring.modelo.ValidadorProducto;
import ar.edu.grupoesfera.cursospring.servicios.ProductoServicio;
import ar.edu.grupoesfera.cursospring.servicios.StockServicio;
#RestController
#MultipartConfig
public class ProductController extends HttpServlet{
private static final long serialVersionUID = 1L;
#Inject
private ProductService productService;
private StockService stockService;
//New product
#RequestMapping (value = "/newProductForm")
public ModelAndView newProductForm(#ModelAttribute("product")Product product){
CategoryCollection categorias = ColeccionCategoria.getInstance();
ColorCollection colores = ColeccionColor.getInstance();
SizeCollection talles = ColeccionTalle.getInstance();
ModelMap model = new ModelMap();
modelo.put("categorias", categorias.listCategory());
modelo.put("colores", colores.listColor());
modelo.put("talles", talles.listSize());
return new ModelAndView ("newProductForm", model);
}
#RequestMapping (value = "/newProductFormConfirm")
public ModelAndView newProductFormConfirm (#ModelAttribute("product")Product product, BindingResult result){
String info;
CategoryCollection categorias = ColeccionCategoria.getInstance();
ColorCollection colores = ColeccionColor.getInstance();
SizeCollection talles = ColeccionTalle.getInstance();
ModelMap model = new ModelMap();
modelo.put("categorias", categorias.listCategory());
modelo.put("colores", colores.listColor());
modelo.put("talles", talles.listSize());
ValidateProduct validateproduct = new ValidateProduct();
validateproduct.validate(product, result);
if (result.hasErrors()) {
return new ModelAndView ("newProductFormConfirm", model);
}
try{
productService.newProduct(product);
info="Success";
}catch(Exception e){
productService.saveExistingProduct(product);
info= e.getMessage();
}
String imgPath ="images/products"+"/"+product.getImgproduct().getOriginalFilename();
modelo.put("info", info);
modelo.put("imdPath", imgPath);
return new ModelAndView ("newProductFormConfirm", model);
}
//List of products
#RequestMapping (value = "/listProducts")
public ModelAndView listProducts(#ModelAttribute("product")Product product){
ModelMap model = new ModelMap();
modelo.put("productService", productService.listProducts());
return new ModelAndView ("listProducts", model);
}
//Getters and Setters for the services
}
I am trying to fetch records from the database and I am having the above error
This is my classs with appropriate getters and setters
public class User {
private int id;
private String username;
private String password;
private String email;
I have also create the database and inserted data into it with the below configuration
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/usersdb"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
This is the complete stacktrace
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/spring] threw exception [Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'usersdb.users' doesn't exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
Please what could be wrong I new on Spring MVC with Hibernate
The complete code for User.java
package net.codejava.spring.model;
public class User {
private int id;
private String username;
private String password;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
You are missing couple of things
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import java.io.Serializable;
import java.util.Date;
#Entity
#Table(name="User")
public class User implements Serializable{
Add this to your class:
#Entity
#Table(name="User") or #Table(name="Users")
public class User
Add this dependencies to your pom.xml. No idea what version of hibernate or spring are you using. Just replace version if you have different one.
<properties>
<springframework.version>4.0.6.RELEASE</springframework.version>
<hibernate.version>4.3.6.Final</hibernate.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.version}</version>
</dependency>
<!-- Joda-Time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- To map JodaTime with database type -->
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.core</artifactId>
<version>3.0.0.CR1</version>
</dependency>
</dependencies>
have you created "users" table ? if User class is mapped to table use annotations #Entity and #Table(name="users"). try this.
This error is killing me, i searched a lot of similar topics here, but none of them helped me!
So, i'm using spring MVC+hibernate. Please, just take a look, maybe you will find mistake which i missed!
Here is my files:
Clients
package app.model;
import javax.persistence.*;
#Entity
#Table(name = "clients")
public class Clients {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private int client_id;
private String gender;
private String first_name;
private String last_name;
private String country;
private String city;
private String birthdate;
private String phone;
private String email;
private int orders;
private double total_income;
public Clients() {
}
public Clients(int client_id, String gender, String first_name,
String last_name, String country, String city, String birthdate,
String phone, String email, int orders, double total_income) {
super();
this.client_id = client_id;
this.gender = gender;
this.first_name = first_name;
this.last_name = last_name;
this.country = country;
this.city = city;
this.birthdate = birthdate;
this.phone = phone;
this.email = email;
this.orders = orders;
this.total_income = total_income;
}
public String getBirthdate() {
return birthdate;
}
public void setBirthdate(String birthdate) {
this.birthdate = birthdate;
}
public int getClient_id() {
return client_id;
}
public void setClient_id(int client_id) {
this.client_id = client_id;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getOrders() {
return orders;
}
public void setOrders(int orders) {
this.orders = orders;
}
public double getTotal_income() {
return total_income;
}
public void setTotal_income(double total_income) {
this.total_income = total_income;
}
}
ClientsService
package app.service;
import java.text.ParseException;
import java.util.List;
import app.model.Clients;
public interface ClientsService {
public void addClient(Clients client);
public void updateClient(Clients client) throws ParseException;
public void deleteClient(Clients client) throws ParseException;
public Clients getClient(int client_id);
public List<Clients> getAllClients();
}
ClientsServiceImpl
package app.service.impl;
import java.text.ParseException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import app.dao.ClientsDao;
import app.model.Clients;
import app.service.ClientsService;
#Service
public class ClientsServiceImpl implements ClientsService {
#Autowired
private ClientsDao clientsDao;
public ClientsServiceImpl() {
}
public List<Clients> getAllClientsList() {
return clientsDao.getAllClients();
}
#Transactional
public void addClient(Clients client) {
clientsDao.addClient(client);
}
#Transactional
public void updateClient(Clients client) throws ParseException{
clientsDao.updateClient(client);
}
#Transactional
public void deleteClient(Clients client) throws ParseException{
clientsDao.deleteClient(client);
}
#Transactional
public Clients getClient(int client_id) {
return clientsDao.getClient(client_id);
}
#Transactional
public List<Clients> getAllClients() {
return clientsDao.getAllClients();
}
}
ClientsDao
package app.dao;
import java.text.ParseException;
import java.util.List;
import app.model.Clients;
public interface ClientsDao {
public void addClient(Clients client);
public void updateClient(Clients client) throws ParseException;
public void deleteClient(Clients client) throws ParseException;
public Clients getClient(int client_id);
public List<Clients> getAllClients();
}
ClientsDaoImpl
package app.dao.impl;
import java.text.ParseException;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import app.model.Clients;
import app.dao.ClientsDao;
import app.logic.Similar;
#Repository
public class ClientsDaoImpl implements ClientsDao {
#Autowired
public SessionFactory session;
public ClientsDaoImpl() {
}
#Transactional
#SuppressWarnings("unchecked")
public List<Clients> getAllClients() {
return session.getCurrentSession().createQuery("from Clients").list();
}
#Transactional
public void addClient(Clients client) { // add new client
session.getCurrentSession().save(client);
}
#Transactional
public void updateClient(Clients client) throws ParseException { // update client
session.getCurrentSession().update(client);
}
#Transactional
public void deleteClient(Clients client) throws ParseException { // delete client if he\she doesnt have any orders
session.getCurrentSession().delete(client);
}
#Transactional
public Clients getClient(int client_id) {
return (Clients)session.getCurrentSession().get(Clients.class, client_id);
}
}
ClientsController
package app.controller;
import java.text.ParseException;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import app.model.Clients;
import app.service.ClientsService;
#Controller
public class ClientsController {
#Autowired
public ClientsService clientsService;
public ClientsController(){
}
#RequestMapping("/index")
public String setupForm(Map<String, Object> map) {
Clients client = new Clients();
map.put("client", client);
map.put("clientsList", clientsService.getAllClients());
return "client";
}
#RequestMapping(value = "/client.do", method = RequestMethod.POST)
public String doActions(#ModelAttribute Clients client,
BindingResult result, #RequestParam String action,
Map<String, Object> map) throws ParseException {
Clients clientResult = new Clients();
switch (action.toLowerCase()) {
case "add":
clientsService.addClient(client);
clientResult = client;
break;
case "edit":
clientsService.updateClient(client);
clientResult = client;
break;
case "delete":
clientsService.deleteClient(client);
clientResult = new Clients();
break;
case "search":
Clients searchedClient = clientsService.getClient(client.getClient_id());
clientResult = searchedClient != null ? searchedClient : new Clients();
break;
}
map.put("client", clientResult);
map.put("clientsList", clientsService.getAllClients());
return "client";
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ProjectMVC</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://localhost:3306/projectdb
jdbc.username=root
jdbc.password=root
spring-servlet.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<context:annotation-config />
<context:component-scan base-package="app.*">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<context:spring-configured />
<bean
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<tx:annotation-driven />
<aop:config proxy-target-class="true"/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</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>Project</groupId>
<artifactId>Project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Hibernate resources -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.7.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.3.0.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-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>20030825.184428</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>20030825.183949</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- Log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<testSourceDirectory>src/main/test</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/webapp</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
upd: forgot 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="app.model.Clients" />
</session-factory>
</hibernate-configuration>
Possibly try this solution from here: Getting a org.springframework.beans.factory.BeanCreationException with my first Maven, Spring Project
just add:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${your-spring-version}</version>
</dependency>
I think your missing the repository name in your ClientsDaoImpl .
#Repository("clientsDAO")
public class ClientsDaoImpl implements ClientsDao.....
I have an issue with getting session on anonymus inner class in hibernate with spring session factory.
Here is the code:
public class DomainDaoImpl extends BasicDaoImpl<Domain> implements Iterable<Collection<Domain>> {
...
#Override
public Iterator<Collection<Domain>> iterator() {
return (new Iterator<Collection<Domain>>() {
private int counter = 0;
public static final int LIMIT = 100;
...
#Override
#Transactional(readOnly = true)
public Collection<Domain> next() {
final Criteria criteria = getCurrentSession().createCriteria(Domain.class);
final LinkedHashSet<Domain> result = new LinkedHashSet<Domain>();
List resultList = null;
while (!(resultList = criteria.list()).isEmpty()) {
criteria.setFirstResult((counter++ * LIMIT) + 1);
criteria.setMaxResults(LIMIT);
result.addAll(resultList);
}
return result;
}
...
});
The issue is org.hibernate.HibernateException: No Session found for current thread
this happens usually when DAO method is not within transaction.
So how to make it work with an inner class?
i think defining #Transactional(readOnly = true) at inner class level, spring will not be able to detect and apply transaction aspect over it. so it will not work for sure.
but i think if you write something like below might work not 100% sure (i doubt once you invoke iterator method transaction is closed)
#Override
#Transactional(readOnly = true)
public Iterator<Collection<Domain>> iterator() {
...
}
another option can be let caller be responsible for transaction or write wrapper method over iterator() like getAllDomain() and apply transaction to that method.
Solution which worked (mentioned in comments)
may be you can do some patch in getCurrentSession() like
getCurrentSession() from sessionFactory if not available then use
openSession(), ofcourse you have to close it manually if new session
opened.
You can configure load-time aspect weaving
Here is the basic example how to do it
Spring context
<?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"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
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-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<context:component-scan base-package="org.foo.bar" />
<context:annotation-config />
<context:load-time-weaver />
<tx:annotation-driven mode="aspectj" proxy-target-class="true"/>
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:schema.sql"/>
</jdbc:embedded-database>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>org.foo.bar.MyEntity</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
Entity class
package org.foo.bar;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
#Entity
#Table(name = "ENTITY")
public class MyEntity {
#Id
private long id;
private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
#Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("MyEntity");
sb.append("{id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}
Dao class
package org.foo.bar;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Iterator;
import java.util.NoSuchElementException;
#Component
public class MyEntityDao implements Iterable<MyEntity> {
#Autowired
private SessionFactory sessionFactory;
#Override
public Iterator<MyEntity> iterator() {
return new Iterator<MyEntity>() {
private int num = 0;
private MyEntity item;
#Override
#Transactional(readOnly = true)
public boolean hasNext() {
item = getEntity();
return item != null;
}
#Override
#Transactional(readOnly = true)
public MyEntity next() {
try {
if(item == null) {
item = getEntity();
if(item == null) {
throw new NoSuchElementException();
}
}
return item;
} finally {
item = null;
}
}
#Override
public void remove() {
throw new UnsupportedOperationException();
}
private MyEntity getEntity() {
final Criteria criteria = getCurrentSession().createCriteria(MyEntity.class);
criteria.setFirstResult(num++);
criteria.setMaxResults(1);
return (MyEntity) criteria.uniqueResult();
}
};
}
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
}
SQL
drop table ENTITY if exists
create table ENTITY (id bigint generated by default as identity (start with 1), name varchar(255), primary key (id))
insert into ENTITY (name) values ('Entity1')
insert into ENTITY (name) values ('Entity2')
insert into ENTITY (name) values ('Entity3')
Unit test
package org.foo.bar;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertEquals;
#RunWith(SpringJUnit4ClassRunner.class)
#ContextConfiguration(locations = {
"classpath:applicationContext.xml"
})
public class MyEntityDaoTest {
#Autowired
private MyEntityDao dao;
#Test
public void testDao() throws Exception {
int count = 0;
for(MyEntity a : dao) {
count++;
}
assertEquals(3, count);
}
}
Here is my pom.xml
http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
<groupId>org.foo.bar</groupId>
<artifactId>spring-aspectj-hibernate</artifactId>
<version>1.0</version>
<properties>
<spring.version>3.1.1.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.12</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.1.1.Final</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
After all you have to run JVM with the following argument -javaagent:<PATH-TO>/spring-instrument-{vertion}.jar. To prevent adding -javaagent argument you can also configure aspectj compile-time weaving.