Socorro! Formulário não adiciona no banco!

Meu formulário não adiciona no no banco de dados. Será que alguém pode dar uma olhada nos códigos. Desde já agradeço!

Aqui o formulário!

<h:form id="cadastroObra">
            <p:panelGrid columns="2" styleClass="semBorda">
                <p:outputLabel value="Código da Obra" for="codigoObra"><br/>
                    <p:inputText id="codigoObra" value="#{obraMB.obra.codigoObra}" maxlength="5" required="true" requiredMessage="Campo código da obra é obrigatorio."/>                    
                </p:outputLabel>
                
                <p:outputLabel value="Código Lapelinc" for="codigoLapelinc"><br/>
                    <p:inputText id="codigoLapelinc" value="#{obraMB.obra.codigoLapelinc}" maxlength="7" required="true" requiredMessage="Campo código do Lapelinc é obrigatorio."/>                                    
                </p:outputLabel>
            </p:panelGrid>
            
            <p:panelGrid columns="2" styleClass="semBorda">
                <p:outputLabel value="Título" for="titulo"/>
                <p:inputText id="titulo" value="#{obraMB.obra.titulo}" maxlength="50" required="true" requiredMessage="Campo título é obrigatorio."/>
            </p:panelGrid>
            
            <p:panelGrid columns="6" styleClass="semBorda">
                <p:outputLabel value="Tipo de Documento" for="tipoDocumento"/>
                <p:inputText id="tipoDocumento" value="#{obraMB.obra.tipodocumento}" maxlength="30" required="true" requiredMessage="Campo tipo de documento é obrigatorio."/>
                
                <p:outputLabel value="Ano Inicial" for="anoInicial"/>
                <p:inputText id="anoInicial" value="#{obraMB.obra.ano1}" maxlength="4" required="true" requiredMessage="Campo ano inicial é obrigatório."/>
                
                <p:outputLabel value="Ano Final" for="anoFinal"/>
                <p:inputText id="anoFinal" value="#{obraMB.obra.ano2}" maxlength="4" required="true" requiredMessage="Campo ano final é obrigatorio."/>                
            </p:panelGrid>
            
            <p:panelGrid columns="6" styleClass="semBorda">
                <p:outputLabel value="Altura" for="altura"/>
                <p:inputText id="altura" value="#{obraMB.obra.altura}" maxlength="6" required="true" requiredMessage="Campo altura é obrigatório."/>
                
                <p:outputLabel value="Largura" for="largura"/>
                <p:inputText id="largura" value="#{obraMB.obra.largura}" maxlength="6" required="true" requiredMessage="Campo largura é obrigatorio."/>
                
                <p:outputLabel value="Profundidade" for="profundidade"/>
                <p:inputText id="profundidade" value="#{obraMB.obra.profundidade}" maxlength="6" required="true" requiredMessage="Campo profundidade é obrigatório."/>
            </p:panelGrid>
            
            <p:panelGrid columns="4" styleClass="semBorda">
                <p:outputLabel value="Material da Capa" for="materialCapa"/>
                <p:inputText id="materialCapa" value="#{obraMB.obra.materialCapa}" maxlength="20" required="true" requiredMessage="Campo material ds capa é obrigatório."/>
                
                <p:outputLabel value="Cor da Capa" for="corCapa"/>
                <p:inputText id="corCapa" value="#{obraMB.obra.corCapa}" maxlength="10" required="true" requiredMessage="Campo cor da capa é obrigatorio."/>
            </p:panelGrid>
            
            <p:panelGrid columns="2" styleClass="semBorda">
                <p:outputLabel value="Número de Páginas" for="numeroPaginas"/>
                <p:inputText id="numeroPaginas" value="#{obraMB.obra.numeroPaginas}" maxlength="5" required="true" requiredMessage="Campo número de páginas é obrigatório."/>
            </p:panelGrid>
            
            <p:panelGrid columns="2" styleClass="semBorda">
                <p:outputLabel value="Observações" for="observacoes"/>
                <p:inputText id="observacoes" value="#{obraMB.obra.observacoes}" maxlength="500"/>
            </p:panelGrid>
             
            <p:panelGrid columns="2" styleClass="semBorda">
                <p:outputLabel value="Codogo Usuario" for="codigoUsuario"/>
                <p:inputText id="codigoUsuario" value="#{obraMB.obra.codigoUsuario}"/>
            </p:panelGrid>
             
             <p:commandButton action="#{obraMB.salvar()}" value="Salvar"/>
            
             <p:messages/>
        </h:form>

Aqui está o Bean

@ManagedBean
public class ObraMB {
    private Obra obra;
    private List<Obra> lista;

    public Obra getObra() {
        return obra;
    }

    public void setObra(Obra obra) {
        this.obra = obra;
    }

    public List<Obra> getLista() {
        return lista;
    }

    public void setLista(List<Obra> lista) {
        this.lista = lista;
    }
    
    public void salvar(){
        ObraDAO dao = new ObraDAO();
        dao.salvar(obra);
        
        inicializar();
    }
    
    @PostConstruct
    public void inicializar(){
        ObraDAO dao = new ObraDAO();
        lista = dao.listar();
        
        obra = new Obra();
    }
}

Aqui está o DAO

public class ObraDAO {
    public void salvar(Obra obra){
        Session sessao = HibernateUtil.getSessionFactory().openSession();
        sessao.beginTransaction();
        
        sessao.persist(obra);
        
        sessao.getTransaction().commit();
        sessao.close();
    }
    
    public List<Obra> listar(){
        Session sessao = HibernateUtil.getSessionFactory().openSession();
        List<Obra> lista = sessao.getNamedQuery("Obra.findAll").list();
        sessao.close();
        
        return lista;
    }
}

Aqui está a classe Obra.

@Entity
@Table(name = "obra")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Obra.findAll", query = "SELECT o FROM Obra o")
    , @NamedQuery(name = "Obra.findByCodigoObra", query = "SELECT o FROM Obra o WHERE o.codigoObra = :codigoObra")
    , @NamedQuery(name = "Obra.findByLargura", query = "SELECT o FROM Obra o WHERE o.largura = :largura")
    , @NamedQuery(name = "Obra.findByTipodocumento", query = "SELECT o FROM Obra o WHERE o.tipodocumento = :tipodocumento")
    , @NamedQuery(name = "Obra.findByMaterialCapa", query = "SELECT o FROM Obra o WHERE o.materialCapa = :materialCapa")
    , @NamedQuery(name = "Obra.findByProfundidade", query = "SELECT o FROM Obra o WHERE o.profundidade = :profundidade")
    , @NamedQuery(name = "Obra.findByTitulo", query = "SELECT o FROM Obra o WHERE o.titulo = :titulo")
    , @NamedQuery(name = "Obra.findByObservacoes", query = "SELECT o FROM Obra o WHERE o.observacoes = :observacoes")
    , @NamedQuery(name = "Obra.findByCorCapa", query = "SELECT o FROM Obra o WHERE o.corCapa = :corCapa")
    , @NamedQuery(name = "Obra.findByAltura", query = "SELECT o FROM Obra o WHERE o.altura = :altura")
    , @NamedQuery(name = "Obra.findByNumeroPaginas", query = "SELECT o FROM Obra o WHERE o.numeroPaginas = :numeroPaginas")
    , @NamedQuery(name = "Obra.findByAno2", query = "SELECT o FROM Obra o WHERE o.ano2 = :ano2")
    , @NamedQuery(name = "Obra.findByAno1", query = "SELECT o FROM Obra o WHERE o.ano1 = :ano1")
    , @NamedQuery(name = "Obra.findByCodigoLapelinc", query = "SELECT o FROM Obra o WHERE o.codigoLapelinc = :codigoLapelinc")})
public class Obra implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "codigo_obra")
    private Integer codigoObra;
    //@Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "largura")
    private Float largura;
    @Column(name = "tipodocumento")
    private String tipodocumento;
    @Column(name = "material_capa")
    private String materialCapa;
    @Column(name = "profundidade")
    private Float profundidade;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "observacoes")
    private String observacoes;
    @Column(name = "cor_capa")
    private String corCapa;
    @Column(name = "altura")
    private Float altura;
    @Column(name = "numero_paginas")
    private Integer numeroPaginas;
    @Column(name = "ano2")
    private Integer ano2;
    @Column(name = "ano1")
    private Integer ano1;
    @Column(name = "codigo_lapelinc")
    private String codigoLapelinc;
    @JoinColumn(name = "codigo_usuario", referencedColumnName = "codigo_usuario")
    @ManyToOne
    private Usuario codigoUsuario;
    @OneToMany(mappedBy = "codigoObra")
    private Collection<Observacao> observacaoCollection;

    public Obra() {
    }

    public Obra(Integer codigoObra) {
        this.codigoObra = codigoObra;
    }

    public Integer getCodigoObra() {
        return codigoObra;
    }

    public void setCodigoObra(Integer codigoObra) {
        this.codigoObra = codigoObra;
    }

    public Float getLargura() {
        return largura;
    }

    public void setLargura(Float largura) {
        this.largura = largura;
    }

    public String getTipodocumento() {
        return tipodocumento;
    }

    public void setTipodocumento(String tipodocumento) {
        this.tipodocumento = tipodocumento;
    }

    public String getMaterialCapa() {
        return materialCapa;
    }

    public void setMaterialCapa(String materialCapa) {
        this.materialCapa = materialCapa;
    }

    public Float getProfundidade() {
        return profundidade;
    }

    public void setProfundidade(Float profundidade) {
        this.profundidade = profundidade;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getObservacoes() {
        return observacoes;
    }

    public void setObservacoes(String observacoes) {
        this.observacoes = observacoes;
    }

    public String getCorCapa() {
        return corCapa;
    }

    public void setCorCapa(String corCapa) {
        this.corCapa = corCapa;
    }

    public Float getAltura() {
        return altura;
    }

    public void setAltura(Float altura) {
        this.altura = altura;
    }

    public Integer getNumeroPaginas() {
        return numeroPaginas;
    }

    public void setNumeroPaginas(Integer numeroPaginas) {
        this.numeroPaginas = numeroPaginas;
    }

    public Integer getAno2() {
        return ano2;
    }

    public void setAno2(Integer ano2) {
        this.ano2 = ano2;
    }

    public Integer getAno1() {
        return ano1;
    }

    public void setAno1(Integer ano1) {
        this.ano1 = ano1;
    }

    public String getCodigoLapelinc() {
        return codigoLapelinc;
    }

    public void setCodigoLapelinc(String codigoLapelinc) {
        this.codigoLapelinc = codigoLapelinc;
    }

    public Usuario getCodigoUsuario() {
        return codigoUsuario;
    }

    public void setCodigoUsuario(Usuario codigoUsuario) {
        this.codigoUsuario = codigoUsuario;
    }

    @XmlTransient
    public Collection<Observacao> getObservacaoCollection() {
        return observacaoCollection;
    }

    public void setObservacaoCollection(Collection<Observacao> observacaoCollection) {
        this.observacaoCollection = observacaoCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codigoObra != null ? codigoObra.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Obra)) {
            return false;
        }
        Obra other = (Obra) object;
        if ((this.codigoObra == null && other.codigoObra != null) || (this.codigoObra != null && !this.codigoObra.equals(other.codigoObra))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.edu.ifba.dovicMaker.entidade.Obra[ codigoObra=" + codigoObra + " ]";
    }
    
}

Lança alguma exception?

Olá Mike! O problema é esse não lança nenhuma exception.

Quando e coloco para listar o conteúdo do banco ele funciona!

Esse é o trecho que lista…

<h:form>
            <p:dataTable var="obra" value="#{obraMB.lista}">
                <p:column headerText="Código">
                    <h:outputText value="#{obra.codigoObra}"/>
                </p:column>
                <p:column headerText="Título">
                    <h:outputText value="#{obra.titulo}"/>
                </p:column>
                <p:column headerText="Nº Páginas">
                    <h:outputText value="#{obra.numeroPaginas}"/>
                </p:column>
            </p:dataTable>
        </h:form>

Põem um System.out.println no salvar do ObraDAO e do ObraMB, só para ver se esta sendo chamado