Don't flush the Session after an exception occurs

Olás,

Estou tendo o seguinte erro ao inserir um registro. O estrando é que ao atualizar um registro que cadastrei pelo BD o erro não ocorre.

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/scpe] threw exception [javax.servlet.ServletException: null id in br.com.scpe.agencia.Agencia entry (don't flush the Session after an exception occurs)] with root cause
org.hibernate.AssertionFailure: null id in br.com.scpe.agencia.Agencia entry (don't flush the Session after an exception occurs)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
	at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
	at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1175)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1699)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
	at br.com.scpe.agencia.AgenciaDAOImp.listar(AgenciaDAOImp.java:33)
	at br.com.scpe.agencia.AgenciaRN.listar(AgenciaRN.java:30)
	at br.com.scpe.web.AgenciaBean.getAgenciaList(AgenciaBean.java:166)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

O erro fala que sobre o id, porém o campo está auto-increment na tabela e minha classe está anotada corretamente.

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Basic(optional = false)
	@Column(name = "id_agencia")
	private Integer id;

Poderiam me ajudar?

Qual o banco de dados e como esta tabela foi criada?

Banco: MySQL 5

Script da Tabela:

CREATE TABLE `agencia` (
  `id_agencia` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(75) NOT NULL,
  `id_municipio` int(11) NOT NULL,
  `bairro` varchar(75) NOT NULL,
  `id_tipo_logradouro` int(11) NOT NULL,
  `logradouro` varchar(75) NOT NULL,
  `numero` int(11) NOT NULL,
  `complemento` varchar(25) DEFAULT NULL,
  `cep` varchar(11) NOT NULL,
  `cnpj` varchar(15) NOT NULL,
  `fone` varchar(15) NOT NULL,
  `contato` varchar(45) NOT NULL,
  PRIMARY KEY (`id_agencia`),
  UNIQUE KEY `id_agencia_UNIQUE` (`id_agencia`),
  UNIQUE KEY `nome_UNIQUE` (`nome`),
  KEY `fk_agencia_municipio1` (`id_municipio`),
  KEY `fk_agencia_tipo_logradouro1` (`id_tipo_logradouro`),
  CONSTRAINT `fk_agencia_municipio1` FOREIGN KEY (`id_municipio`) REFERENCES `municipio` (`id_municipio`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_agencia_tipo_logradouro1` FOREIGN KEY (`id_tipo_logradouro`) REFERENCES `tipo_logradouro` (`id_tipo_logradouro`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1$$

E o método que persiste?

 @Override
    public void salvar(Agencia agencia) {
        this.session.save(agencia);
    }

E já tentei tbém com o saveOrUpdate e ocorre o mesmo problema.