OI pessoal tudo bem…to tendo um problema aqui em um projeto de tg quando mando cadastrar o fornecedor e qualquer um que esteja ligado por herança na superclasse Pessoa, utilizando jsf 2.0 e hibernate se alguem poderia me ajuda ficarEI muito agradecido…DESDE JA AGRADEÇO!!
O erro que esta dando é esse QUANDO TENTO CADASTRAR O FORNECEDOR(SO POSTEI DO FORNECEDOR PQ AS COUTRAS CLASSES SAO IGUAIS, SE RESOLVER ESSE RESOLVO OS OUTROS…)
ERRO
LOG APACHE TOMCAT 7.0.27.0
04/11/2012 14:15:26 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/EcommerceEtelj] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkNaturalId(DefaultFlushEntityEventListener.java:89)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:169)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:120)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at br.com.ecommerceetelj.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
APACHE TOMCAT 7.0.27.0
Hibernate:
/* get current natural-id state br.com.ecommerceetelj.model.Fornecedor */ select
fornecedor_.email_pessoa as email7_0_
from
fornecedor fornecedor_
where
fornecedor_.id_pessoa=?
04/11/2012 14:16:29 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already. Could not load com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1597)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:974)
at com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1391)
at com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1364)
at com.mchange.v2.resourcepool.BasicResourcePool.cullExpired(BasicResourcePool.java:1444)
at com.mchange.v2.resourcepool.BasicResourcePool.access$1900(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$CullTask.run(BasicResourcePool.java:1910)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Exception in thread “Timer-0” java.lang.NoClassDefFoundError: com/mchange/v2/resourcepool/BasicResourcePool$1DestroyResourceTask
at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:974)
at com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1391)
at com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1364)
at com.mchange.v2.resourcepool.BasicResourcePool.cullExpired(BasicResourcePool.java:1444)
at com.mchange.v2.resourcepool.BasicResourcePool.access$1900(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$CullTask.run(BasicResourcePool.java:1910)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
… 8 more
BANCO
CREATE TABLE pessoa(
id_pessoa serial NOT NULL,
nome_pessoa character varying(100) NOT NULL,
endereco_pessoa character varying(200),
email_pessoa character varying(100) NOT NULL unique,
senha_pessoa character varying(45) NOT NULL,
cidade_pessoa character varying(100) NOT NULL,
estado_pessoa character varying(2) NOT NULL,
data_nascimento_pessoa date NOT NULL,
ceppessoa_pessoa character varying(9) NOT NULL,
telefone_pessoa character varying(20),
cpfcnpj_pessoa character varying(14) NOT NULL,
ativo_usuario_pessoa boolean, --nova mudança aqui, adiçao do campo.
CONSTRAINT pk_pessoa PRIMARY KEY(id_pessoa)
);
CREATE TABLE fornecedor(
inscrEstadual_fornecedor character varying(14) not null,
razaoSocial_fornecedor character varying(45) not null,
responsavel_fornecedor character varying(100) not null
)inherits (pessoa);
CREATE TABLE cliente(
dataCadastro_cliente date not null
)inherits (pessoa);
CREATE TABLE administrador(
setor_admin character varying(100) not null,
login_administrador varchar(45) not null
)inherits (pessoa);
CREATE TABLE funcionario(
setor_funcionario character varying(100) not null,
cargo_funcionario character varying(100) not null
)inherits (pessoa);
--==================================================================
MODEL PESSOA(SUPER CLASSE)
package br.com.ecommerceetelj.model;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import org.hibernate.annotations.NaturalId;
/**
*
* @author V4GN3R TSI FATEC
*/
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@SequenceGenerator(name = "seq_pessoa",
sequenceName = "pessoa_id_pessoa_seq",
allocationSize = 1, initialValue = 1)
public class Pessoa implements Serializable {
private static final long serialVersionUID = -8067182859748424879L;
@Id
@GeneratedValue(generator="seq_pessoa")
@Column(name = "id_pessoa")
private Integer idPessoa;
@Column(name = "nome_pessoa", length = 100, nullable = false)
private String nomePessoa;
@Column(name = "endereco_pessoa", length = 200, nullable = false)
private String enderecoPessoa;
@NaturalId
@Column(name = "email_pessoa", length = 100, nullable = false)
private String emailPessoa;
@Column(name = "senha_pessoa", length = 45, nullable = false)
private String senhaPessoa;
@Column(name = "cidade_pessoa", length = 100, nullable = false)
private String cidadePessoa;
@Column(name = "estado_pessoa", length = 2, nullable = false)
private String estadoPessoa;
@Temporal(javax.persistence.TemporalType.DATE)
@Column(name="data_nascimento_pessoa", nullable = false)
private Date dataNascimentoPessoa;
@Column(name = "cep_pessoa", length = 9, nullable = false)
private String cepPessoaPessoa;
@Column(name = "telefone_pessoa", length = 20, nullable = true)
private String telefonePessoa;
@Column(name = "cpfcnpj_pessoa", length = 14, nullable = false)
private String cpfCnpjPessoa;
@Column(name = "ativo_usuario_pessoa")
private boolean ativoUsuarioPessoa;
//CONSTRUTORES COM E SEM PARAMETROS
public Pessoa() {
}
public Pessoa(Integer idPessoa, String nomePessoa, String enderecoPessoa, String emailPessoa, String senhaPessoa, String cidadePessoa, String estadoPessoa, Date dataNascimentoPessoa, String cepPessoaPessoa, String telefonePessoa, String cpfCnpjPessoa, boolean ativoUsuarioPessoa) {
this.idPessoa = idPessoa;
this.nomePessoa = nomePessoa;
this.enderecoPessoa = enderecoPessoa;
this.emailPessoa = emailPessoa;
this.senhaPessoa = senhaPessoa;
this.cidadePessoa = cidadePessoa;
this.estadoPessoa = estadoPessoa;
this.dataNascimentoPessoa = dataNascimentoPessoa;
this.cepPessoaPessoa = cepPessoaPessoa;
this.telefonePessoa = telefonePessoa;
this.cpfCnpjPessoa = cpfCnpjPessoa;
this.ativoUsuarioPessoa = ativoUsuarioPessoa;
}
//=============GETTERS E SETTERS================================================
//EQUALS E HASHCODE=============================================================
============================================================================
MODEL FUNCIONARIO
@Entity
@Table(name = "funcionario")
public class Funcionario extends Pessoa{
private static final long serialVersionUID = -5924963269584576388L;
@Column(name = "setor_funcionario", length = 100, nullable = false)
private String setorFuncionario;
@Column(name = "cargo_funcionario", length = 100, nullable = false)
private String cargoFuncionario;
//CONSTRUTORES
public Funcionario() {
this("","",1,"","","","","","",null,"","","",false);
}
public Funcionario(String setorFuncionario, String cargoFuncionario, Integer idPessoa, String nomePessoa,
String enderecoPessoa, String emailPessoa, String senhaPessoa, String cidadePessoa, String estadoPessoa,
Date data_nascimento_pessoa, String ceppessoaPessoa, String telefonePessoa, String cpfCnpjPessoa,
boolean ativo_usuario_pessoa) {
super(idPessoa, nomePessoa, enderecoPessoa, emailPessoa, senhaPessoa, cidadePessoa, estadoPessoa,
data_nascimento_pessoa, ceppessoaPessoa, telefonePessoa, cpfCnpjPessoa, ativo_usuario_pessoa);
this.setorFuncionario = setorFuncionario;
this.cargoFuncionario = cargoFuncionario;
}
//==========GETTERS E SETTERS===================================================
//==========EQUALS E HASHCODE==================================================
===========================================================================
FORNECEDOR DAOIMPL
public class FornecedorDAOImpl implements FornecedorDAO {
private Session session;
public void setSession(Session session) {
this.session = session;
}
@Override
public void salvar(Fornecedor fornecedor) {
this.session.save(fornecedor);
}
@Override
public void atualizar(Fornecedor fornecedor) {
this.session.update(fornecedor);
}
@Override
public void excluir(Fornecedor fornecedor) {
this.session.delete(fornecedor);
}
@Override
public Fornecedor carregar(int id_pessoa) {
return (Fornecedor) this.session.get(Fornecedor.class, id_pessoa);
}
@Override
public List<Fornecedor> listar() {
return this.session.createCriteria(Fornecedor.class).list();
}
}
========================================================================
FORNECEDORBEAN
/**
*
* @author V4GN3R TSI FATEC
*/
@ManagedBean(name = "fornecedorBean")
@RequestScoped
public class FornecedorBean {
private Pessoa pessoa = new Pessoa();
private String destinoSalvarFornecedor;
private Fornecedor fornecedor = new Fornecedor();
private List<Fornecedor> lista;
private String confirmaSenha;
public String novo() {
this.setDestinoSalvarFornecedor("sucessofornecedor");
this.fornecedor = new Fornecedor();
this.fornecedor.setAtivoUsuarioPessoa(true);
this.setFornecedor(new Fornecedor());
return "/admin/cadastrarfornecedor";
}
public String salvar() {
FacesContext context = FacesContext.getCurrentInstance();
String senha = this.fornecedor.getSenhaPessoa();
if (!senha.equals(this.confirmaSenha)) {
FacesMessage facesMessage = new FacesMessage("As senhas não conferem!");
context.addMessage(null, facesMessage);
return null;
}
FornecedorRN fornecedorRN = new FornecedorRN();
fornecedorRN.salvar(getFornecedor());
return destinoSalvarFornecedor;//retorna para a pagina sucessofornecedor.xhtml
}
//METODO ATIVAR USUARIO, VERIFICA SE O FORNECEDOR ESTA ATIVO OU INATIVO, MUDA O STATUS
public String ativarUsuario() {
if (this.fornecedor.isAtivoUsuarioPessoa()) {
this.fornecedor.setAtivoUsuarioPessoa(false);
} else {
this.fornecedor.setAtivoUsuarioPessoa(true);
}
FornecedorRN fornecedorRN = new FornecedorRN();
fornecedorRN.salvar(this.fornecedor);
this.lista = null;
return null;
}
//METODO LISTAR
//vai no banco e pega todos as categorias cadastrados
//MANDA PARA O DATATABLE
public List<Fornecedor> getLista() {
if (this.lista == null) {
FornecedorRN fornecedorRN = new FornecedorRN();
this.lista = fornecedorRN.listar();
}
return this.lista;
}
//METODO EXCLUIR
public String excluir() {
FornecedorRN fornecedorRN = new FornecedorRN();
fornecedorRN.excluir(this.getFornecedor());
this.lista = null;
return null;
}
//METODO EDITAR
public String editar() {
this.confirmaSenha = this.fornecedor.getSenhaPessoa();
// return "/Publico/cadastrarcategoria";
return "/admin/cadastrarfornecedor";
}
//=======GETTERS E SETTERS======================================================
=================================================================================
FORNECEDORRN(CONTROLLER)
public class FornecedorRN {
private FornecedorDAO fornecedorDAO;
public FornecedorRN(){
this.fornecedorDAO = DAOFactory.criarFornecedorDAO();
}
//METODO SALVA E ATUALIZA
public void salvar(Fornecedor fornecedor) {
Integer id_fornecedor = fornecedor.getIdPessoa();
if (id_fornecedor == null || id_fornecedor == 0) {
this.fornecedorDAO.salvar(fornecedor);
} else {
this.fornecedorDAO.atualizar(fornecedor);
}
}
//METODO LISTAR
public List<Fornecedor> listar() {
return this.fornecedorDAO.listar();
}
//METODO EXCLUIR
public void excluir(Fornecedor fornecedor) {
this.fornecedorDAO.excluir(fornecedor);
}
//METODO CARREGAR
public Fornecedor carregar(Integer id_fornecedor) {
return this.fornecedorDAO.carregar(id_fornecedor);
}
/=================================================================================
HIBERNATE.CFG.XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/ecommerceEtelj</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password">200297</property>
<!--Adicionar config do pool de conexão C3P0 -->
<property name="hibernate.current_session_context_class">thread</property>
<!--Criando a POOL de Conexões utilizando a biblioteca C3P0 -->
<property name="hibernate.c3p0.min_size">5</property><!--MINIMO DE CONEXÕES -->
<property name="hibernate.c3p0.max_size">20</property><!--MAXIMO DE CONEXÕES -->
<property name="hibernate.c3p0.timeout">300</property><!--TEMPO MAXIMO LIMITE -->
<property name="hibernate.c3p0.max_statements">50</property><!--MAXIMO DE STMT -->
<property name="hibernate.c3p0.idle_test_period">3000</property><!--TEMPO MAXIMO DE INATIVIDADE -->
<!--CONFIGURAÇÃO DE DEBUG -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.generate_statistics">true</property>
<property name="hibernate.use_sql_comments">true</property>
<!--EXEMPLO MAPEAMENTO DA CLASSE -->
<!-- <mapping class="br.com.projetofinanceiro.model.Usuario"/> -->
<!--MAPEAMENTO DAS CLASSES LIGADOS POR HERANÇA -->
<mapping class="br.com.ecommerceetelj.model.Pessoa"/>
<mapping class="br.com.ecommerceetelj.model.Fornecedor"/>
<mapping class="br.com.ecommerceetelj.model.Cliente"/>
<mapping class="br.com.ecommerceetelj.model.Funcionario"/>
<mapping class="br.com.ecommerceetelj.model.Administrador"/>
<!--MAPEAMENTOS DAS CLASSES NORMAIS - SEM HERANÇA -->
<mapping class="br.com.ecommerceetelj.model.Categoria"/>
<mapping class="br.com.ecommerceetelj.model.Produto"/>
<mapping class="br.com.ecommerceetelj.model.ContaPagar"/>
<mapping class="br.com.ecommerceetelj.model.ContaReceber"/>
<mapping class="br.com.ecommerceetelj.model.ItensMateriaPrima"/>
<mapping class="br.com.ecommerceetelj.model.ItensPedido"/>
<mapping class="br.com.ecommerceetelj.model.MateriaPrima"/>
<mapping class="br.com.ecommerceetelj.model.MovimentacaoEstoque"/>
<mapping class="br.com.ecommerceetelj.model.Pedido"/>
<mapping class="br.com.ecommerceetelj.model.PedidoCompra"/>
</session-factory>
</hibernate-configuration>
==================================================================================
VIEW(FORMULARIO)
<h:body>
<h1>Cadastrar Fornecedor</h1>
<h:form id="cadastrarfornecedor">
<h:messages/>
<h:inputHidden value="#{fornecedorBean.fornecedor.idPessoa}"/>
<h:inputHidden value="#{fornecedorBean.destinoSalvarFornecedor}"/><!--resolve o problema da variavel destinoSalvar ser limpa -->
<h:panelGrid columns="2">
<h:outputLabel value="Nome: " for="nome"/>
<h:inputText id="nome" label="Nome" value="#{fornecedorBean.fornecedor.nomePessoa}" size="30" maxlength="100" required="true"
requiredMessage="O nome do funcionario é obrigatório!!"><f:validateLength minimum="3" maximum="100"/>
</h:inputText>
<h:outputLabel value="Endereço: " for="endereco"/>
<h:inputText id="endereco" label="Endereço" value="#{fornecedorBean.fornecedor.enderecoPessoa}" size="30" maxlength="200" required="true"
requiredMessage="O endereço é obrigatório!!"><f:validateLength minimum="3" maximum="200"/>
</h:inputText>
<h:outputLabel value="Email" for="email"/>
<h:panelGroup>
<h:inputText id="email" label="Email" value="#{fornecedorBean.fornecedor.emailPessoa}" size="50"
maxlength="100" required="true" requiredMessage="E_mail Obrigatório!" validatorMessage="E-mail inválido!">
<f:validateRegex pattern="[a-zA-Z0-9\-\_\.]+@[a-zA-Z0-9\-\_\.]+"/>
</h:inputText>
<h:message for="email"/>
</h:panelGroup>
<h:outputLabel value="Senha:" for="senha"/>
<h:inputSecret id="senha" label="Senha" value="#{fornecedorBean.fornecedor.senhaPessoa}" size="20" required="true"
redisplay="false"/>
<h:outputLabel value="Confirma Senha:" for="confirmarsenha"/>
<h:inputSecret id="confirmarsenha" label="Confirmação de Senha" value="#{fornecedorBean.confirmaSenha}" size="20"
maxlength="45" required="true" redisplay="false"/>
<h:outputLabel value="Cidade: " for="cidade"/>
<h:inputText id="cidade" label="Cidade" value="#{fornecedorBean.fornecedor.cidadePessoa}" size="30" maxlength="100" required="true"
requiredMessage="O nome da cidade é obrigatório!!"><f:validateLength minimum="3" maximum="100"/>
</h:inputText>
<h:outputLabel value="Estado: " for="estado"/>
<h:inputText id="estado" label="Estado" value="#{fornecedorBean.fornecedor.estadoPessoa}" size="10" maxlength="2" required="true"
requiredMessage="O estado é obrigatório!!"><f:validateLength minimum="2" maximum="2"/>
</h:inputText>
<h:outputLabel value="Data de Nascimento" for="data"/>
<h:inputText id="data" label="Data de Nascimento" value="#{fornecedorBean.fornecedor.dataNascimentoPessoa}"
size="10" maxlength="10" required="true" requiredMessage="Campo Data de Nascimento Obrigatório!!">
<f:convertDateTime dateStyle="medium"/>
</h:inputText>
<h:outputLabel value="CEP: " for="cep"/>
<h:inputText id="cep" label="CEP" value="#{fornecedorBean.fornecedor.cepPessoaPessoa}" size="10" maxlength="9" required="true"
requiredMessage="O CEP é obrigatório!!"><f:validateLength minimum="3" maximum="10"/>
</h:inputText>
<h:outputLabel value="Telefone: " for="telefone"/>
<h:inputText id="telefone" label="Telefone" value="#{fornecedorBean.fornecedor.telefonePessoa}" size="30" maxlength="20" required="true"
requiredMessage="O numero do telefone é obrigatório!!"><f:validateLength minimum="3" maximum="20"/>
</h:inputText>
<h:outputLabel value="CPF-CNPJ: " for="cpfcnpj"/>
<h:inputText id="cpfcnpj" label="CPF-CNPJ" value="#{fornecedorBean.fornecedor.cpfCnpjPessoa}" size="30" maxlength="14" required="true"
requiredMessage="O numero do CPF ou CNPJ é obrigatório!!"><f:validateLength minimum="3" maximum="14"/>
</h:inputText>
<h:outputLabel value="Inscrição Estadual: " for="inscricao"/>
<h:inputText id="inscricao" label="Inscrição Estadual" value="#{fornecedorBean.fornecedor.inscrEstadualFornecedor}" size="30" maxlength="14" required="true"
requiredMessage="O numero da Inscrição Estadual é obrigatório!!"><f:validateLength minimum="3" maximum="30"/>
</h:inputText>
<h:outputLabel value="Razão Social: " for="razao"/>
<h:inputText id="razao" label="Razão Social" value="#{fornecedorBean.fornecedor.razaoSocialFornecedor}" size="30" maxlength="45" required="true"
requiredMessage="O numero da Razão Social é obrigatório!!"><f:validateLength minimum="3" maximum="30"/>
</h:inputText>
<h:outputLabel value="Responsavel: " for="responsavel"/>
<h:inputText id="responsavel" label="Responsavel" value="#{fornecedorBean.fornecedor.responsavelFornecedor}" size="30" maxlength="100" required="true"
requiredMessage="O nome do Responsavel é obrigatório!!"><f:validateLength minimum="3" maximum="30"/>
</h:inputText>
</h:panelGrid>
<h:commandButton action="#{fornecedorBean.salvar()}" value="Salvar"/>
</h:form>
</h:body>

entao nao sei rsrs…eh o meu primeiro projeto em jsf e hibernate , to fazendo o meu tcc, e nunca tinha visto herança em jsf nem hibernate em um proejto real so para estudo …entao to apanhando que nem um condenado…