Erro de mapeamento

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.