Erro:
GRAVE: Servlet.service() for servlet [appServlet] in context with path [/extensao] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: Professor is not mapped [ SELECT p FROM Professor p]] with root cause
org.hibernate.hql.ast.QuerySyntaxException: Professor is not mapped [ SELECT p FROM Professor p]
Classes
Classe Professor
package br.newtonpaiva.extensao.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "tb_professor")
public class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long cod_professor;
private Long nom_nome;
public Long getCod_professor() {
return cod_professor;
}
public void setCod_professor(Long cod_professor) {
this.cod_professor = cod_professor;
}
public Long getNom_nome() {
return nom_nome;
}
public void setNom_nome(Long nom_nome) {
this.nom_nome = nom_nome;
}
}
Classe controller
package br.newtonpaiva.extensao.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import br.newtonpaiva.extensao.model.Professor;
import br.newtonpaiva.extensao.model.ProfessorRepository;
@Controller
@RequestMapping("professores")
public class ProfessorController {
@Autowired
ProfessorRepository repository;
@RequestMapping(method = RequestMethod.GET)
public String index(Model model) {
List<Professor> listaProfessores = repository.listar();
model.addAttribute("listaProfessores", listaProfessores);
return "professores";
}
}
Classe Repository
package br.newtonpaiva.extensao.model;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
@Repository
public class ProfessorRepository {
@PersistenceContext
private EntityManager manager;
/**
* Lista todos os professores
*/
@SuppressWarnings("unchecked")
public List<Professor> listar() {
return manager.createQuery("SELECT p FROM Professor p").getResultList();
}
/**
* Lista todos os professores por nome
*/
@SuppressWarnings("unchecked")
public List<Professor> listarNome(String professor) {
return manager.createQuery("SELECT p FROM Professor p WHERE p.nom_nome LIKE '%" + professor + "%' ")
.getResultList();
}
}
No persistence.xml, dentro da tag persistence-unit, coloque isso:
<class>br.newtonpaiva.extensao.model.Professor</class>
Fiz assim e não mudou
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="extensao">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>br.newtonpaiva.extensao.model.Professor</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.show_sql" value="update" />
<property name="show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.autocommit" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
</properties>
</persistence-unit>
</persistence>
Estranho, eu tinha certeza que isso ia funcionar, porque o erro que tá dando é por que o EntityManager não tá achando a classe Professor como entidade. Experimenta apagar a tag <class>...</class>, e colocar isso daqui no lugar:
<exclude-unlisted-classes>false</exclude-unlisted-classes>
Ah, eu vi agora que você tá usando spring (pela tag do post). Para fazer as entidades serem descobertas automaticamente, o esquema é um pouco diferente do Java EE. Aqui tem um guia:
Você tem que configurar um negócio chamado “packagesToScan”, pelo que eu vi aqui. Não tenho muita familiaridade com Spring, mas foi isso que eu encontrei pesquisando no Google.
Funcionou.
O context estava assim:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
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-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<context:annotation-config />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="punit" />
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.pluralsight.model" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<entry key="hibernate.hbm2ddl.auto" value="none" />
<entry key="hibernate.format_sql" value="true" />
</map>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost:5432/extensao" />
<property name="username" value="postgres" />
<property name="password" value="Maker@1" />
</bean>
</beans>
Ai mudei para:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
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-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<context:annotation-config />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<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="showSql" value="true" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<entry key="hibernate.hbm2ddl.auto" value="none" />
<entry key="hibernate.format_sql" value="true" />
</map>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost:5432/extensao" />
<property name="username" value="postgres" />
<property name="password" value="Maker@1" />
</bean>
</beans>
O persistence.xml estava assim
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="extensao">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.show_sql" value="update" />
<property name="show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.autocommit" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
</properties>
</persistence-unit>
</persistence>
mudei para
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="extensao">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>br.newtonpaiva.extensao.model.Professor</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.show_sql" value="update" />
<property name="show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.autocommit" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
</properties>
</persistence-unit>
</persistence>
Resolvido e este tópico pode ser fechado.