我正在研究一些Spring MVC CRUD应用程序.有一些奇怪的问题:
>配置类:
package sbk.spring.simplejc.config;
import java.util.Properties;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionfactorybean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
@Configuration //Specifies the class as configuration
@ComponentScan("sbk.spring.simplejc") //Specifies which package to scan
//@Import({DataBaseConfig.class})
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
@EnableWebMvc //Enables to use Spring's annotations in the code
public class WebAppConfig extends WebMvcConfigurerAdapter{
private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
private static final String PROPERTY_NAME_HIBERNATE_SHOW_sql = "hibernate.show_sql";
private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
@Resource
private Environment env;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getrequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
dataSource.setUrl(env.getrequiredProperty(PROPERTY_NAME_DATABASE_URL));
dataSource.setUsername(env.getrequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
dataSource.setPassword(env.getrequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
return dataSource;
}
@Bean
public LocalSessionfactorybean sessionFactory() {
LocalSessionfactorybean sessionfactorybean = new LocalSessionfactorybean();
sessionfactorybean.setDataSource(dataSource());
sessionfactorybean.setPackagesToScan(env.getrequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
sessionfactorybean.setHibernateProperties(hibProperties());
return sessionfactorybean;
}
private Properties hibProperties() {
Properties properties = new Properties();
properties.put(PROPERTY_NAME_HIBERNATE_DIALECT,env.getrequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
properties.put(PROPERTY_NAME_HIBERNATE_SHOW_sql,env.getrequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_sql));
return properties;
}
@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Bean
public UrlBasedViewResolver setupViewResolver() {
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
}
> application.properties:
#DB properties:
db.driver=com.microsoft.sqlserver.jdbc.sqlServerDriver
db.url=jdbc:sqlserver://127.0.0.1:1433;databaseName=Examples
db.username=sa
db.password=
#Hibernate Configuration:
hibernate.dialect=org.hibernate.dialect.sqlServerDialect
hibernate.show_sql=true
entitymanager.packages.to.scan=sbk.spring.simplejc.entity
> @Entity类:
package sbk.spring.simplejc.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="Team")
public class Team {
@Id
@GeneratedValue
private Integer id;
private String name;
private Integer rating;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getRating() {
return rating;
}
public void setRating(Integer rating) {
this.rating = rating;
}
}
>控制器类:
package sbk.spring.simplejc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import sbk.spring.simplejc.service.ITeamService;
@Controller
public class TeamController {
@Autowired
ITeamService service;
@RequestMapping(value="/")
public ModelAndView goToHelloPage() {
ModelAndView view = new ModelAndView();
view.addObject("teamList",service.listTeams());
return view;
}
}
>错误堆栈跟踪:
org.hibernate.hql.internal.ast.QuerySyntaxException: Team is not mapped [from Team]
org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
org.hibernate.hql.internal.ast.HqlsqlWalker.createFromElement(HqlsqlWalker.java:324)
org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.fromElement(HqlsqlBaseWalker.java:3420)
org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.fromElementList(HqlsqlBaseWalker.java:3309)
org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.fromClause(HqlsqlBaseWalker.java:706)
org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.query(HqlsqlBaseWalker.java:562)
org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.selectStatement(HqlsqlBaseWalker.java:299)
org.hibernate.hql.internal.antlr.HqlsqlBaseWalker.statement(HqlsqlBaseWalker.java:247)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
org.hibernate.engine.query.spi.HQLQueryPlan.
我对这个问题一无所知.
更新
> DAO类:
package sbk.spring.simplejc.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 sbk.spring.simplejc.entity.Team;
@Repository
public class HibTeamDAO implements TeamDAO {
@Autowired
private SessionFactory sessionFactory;
public void addTeam(Team team) {
sessionFactory.getCurrentSession().save(team);
}
public void updateTeam(Team team) {
sessionFactory.getCurrentSession().update(team);
}
@SuppressWarnings("unchecked")
public List
> TeamController类:
package sbk.spring.simplejc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import sbk.spring.simplejc.service.ITeamService;
@Controller
public class TeamController {
@Autowired
ITeamService service;
@RequestMapping(value="/")
public ModelAndView goToHelloPage() {
ModelAndView view = new ModelAndView();
view.addObject("teamList",service.listTeams());
return view;
}
}
更新
现在我通过改变DAO方法摆脱了这个问题
return sessionFactory.getCurrentSession().createQuery("from Team").list();
至
return sessionFactory.getCurrentSession().createQuery("from sbk.spring.simplejc.entity.Team").list();
但是收到了另一个问题:尽管Team表中存在行,但每个查询都返回null.
更新
最后我发现了警告信息:
Feb 15,2014 7:01:05 PM org.hibernate.hql.internal.QuerySplitter concreteQueries
WARN: HHH000183: no persistent classes found for query class: from sbk.spring.simplejc.entity.Team
更新
至少我已经通过在WebAppConfig中的dataSource bean定义中添加下一行代码来解决这个问题:
public LocalSessionfactorybean sessionFactory() {
LocalSessionfactorybean sessionfactorybean = new LocalSessionfactorybean();
sessionfactorybean.setDataSource(dataSource());
sessionfactorybean.setAnnotatedClasses(new Class[]{Team.class});//new row!!!
sessionfactorybean.setPackagesToScan(env.getrequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
sessionfactorybean.setHibernateProperties(hibProperties());
return sessionfactorybean;
}
最佳答案
@H_502_106@在我的情况下,这是因为我没有hibernate packagesToScan属性.我知道你拥有它.可能此评论对错过它的人有用.