[RESOLVIDO, OU QUASE] Hibernate - Problemas com o mapeamento

Olá amigos.
Estou estudando o Hibernate para emprega-lo em uma aplicação que irei desenvolver. Porém, estou tendo problemas com o mapeamento. Já tentei um monte de coisas, no entanto, nada parece resolver.

Estou usando o PostgreSQL 8.1, no qual tenho a seguinte tabela:

  id int4 NOT NULL DEFAULT nextval('contatos_seq'::regclass),
  nome varchar(100),
  endereco varchar(200),
  bairro varchar(100),
  cidade varchar(100),
  estado varchar(2),
  telefone varchar(20),
  celular varchar(20),
  email varchar(100),
  CONSTRAINT contatos_pkey PRIMARY KEY (id)

Meu arquivo de mapeamento (Contatos.hbm.xml) está assim (considerando que o cabeçalho XML foi omitido):


<hibernate-mapping>
	<class name="hibernateteste.Contato" table="contatos">
		<id name="id" column="id" type="int">
			<generator class="sequence">
				<param name="sequence">contatos_seq</param>
			</generator>
		</id>
		
		<property name="nome"		type="string" column="nome"/>
		<property name="endereco"	type="string" column="endereco"/>
		<property name="bairro"		type="string" column="bairro"/>
		<property name="cidade" 	type="string" column="cidade"/>
		<property name="estado" 	type="string" column="estado"/>
		<property name="telefone" 	type="string" column="telefone"/>
		<property name="celular" 	type="string" column="celular"/>
		<property name="email"		type="string" column="email"/>
	</class>
</hibernate-mapping>

Porém, quando tento conectar, tenho a seguinte exception:

org.hibernate.InvalidMappingException: Could not parse mapping document from resource Contato.hbm.xml
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:569)
        at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1587)
        at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1555)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1534)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1508)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
        at hibernateteste.Exemplo2.hibernateConnect(Exemplo2.java:34)
        at hibernateteste.Exemplo2.<init>(Exemplo2.java:28)
        at hibernateteste.Exemplo2$5.run(Exemplo2.java:348)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from invalid mapping
        at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:502)
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:566)
        ... 16 more
Caused by: org.xml.sax.SAXParseException: Attribute "name" must be declared for element type "param".
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.addDTDDefaultAttrsAndValidate(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.handleStartElement(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.dom4j.io.SAXReader.read(SAXReader.java:465)
        at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:499)
        ... 17 more

Alguém sabe me dizer o que está havendo de errado?
Obrigado!

Me parece que o erro está na declaração da tag <id>.
Pelo que sei, vc não pode fazer assim: type="int"
e sim desta forma: type=“java.lang.Integer”

Falou.

olhando o restante do seu código, onde estiver type="string"
muda para type=“java.lang.String”

[quote=“AndersonC”]olhando o restante do seu código, onde estiver type="string"
muda para type=“java.lang.String”[/quote]

Cara, muito obrigado pela atenção, porém não adiantou nada. :sad:
Mudei o type para “java.lang.String” e o id para “java.lang.Integer”, mas ainda tenho a mesma exception.

Repare que na exceção diz: Attribute “name” must be declared for element type “param”. Acho que esse problema tem relação com o Generator.
Esse mesmo código tinha funcionado em uma outra ocasião, quando eu ainda não estava usando o sequence para gerar a chave auto-incrementável da tabela. No entanto, agora não funciona de jeito algum!

De qualquer forma, obrigado!
Alguma outra sugestão?

Então pessoal, resolvi simplificar mais o teste para localizar o problema e acabei descobrindo que o generator pode ser mesmo a causa.

Criei uma tabela chamada pessoas, que é definida por:

  id int4 NOT NULL DEFAULT nextval&#40;'pessoas_id_seq'&#58;&#58;regclass&#41;,
  nome varchar&#40;200&#41;,
  CONSTRAINT pessoas_pkey PRIMARY KEY &#40;id&#41;

E então descobri que se eu inserir um generator dessa forma, no Pessoas.hbm.xml:

&lt;id name=&quot;id&quot; column=&quot;id&quot; type=&quot;java.lang.Integer&quot;&gt;
    &lt;generator class=&quot;sequence&quot;&gt;
        &lt;param name=&quot;sequence&quot;&gt;pessoas_id_seq&lt;/param&gt;
    &lt;/generator&gt;
&lt;/id&gt;

é gerado um erro dizendo Attribute “name” must be declared for element type “param”.

Porém, se eu fizer o mapeamento assim:

&lt;id name=&quot;id&quot; column=&quot;id&quot; type=&quot;java.lang.Integer&quot;&gt;
    &lt;generator class=&quot;sequence&quot;/&gt;
&lt;/id&gt;

o danado funciona.
O problema é que dessa forma não dá para gravar no banco, já que não tem um sequence para recuperar o próximo id (auto-incremento).

Alguém saberia como resolver isso?

Estamos quase lá!

Então pessoal.
Andei dando uma olhada na documentação e resolvi alterar o meu Pessoa.hbm.xml para:

&lt;id name=&quot;id&quot; column=&quot;id&quot; type=&quot;java.lang.Integer&quot;&gt;
    &lt;generator class=&quot;increment&quot; /&gt;
&lt;/id&gt; 

e não é que o danado funfou!?
Agora, gostaria muito de saber porquê o increment funciona e o sequence não.
Imagino que tenha alguma relação com o jeito que a tabela foi criada.
Alguém sabe explicar tal fenômeno?