Posso customizar o mapeamento no persistence.xml?

10 respostas
brccosta

Senhores,

Para a classe Cliente, abaixo:
public class Cliente implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private int id;
	private String nome;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}	
}
Mapeamento que faço com o Hibernate:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
    <class name="Cliente" table="cliente">
        <id name="id" column="cliente_id" type="long" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="nome" type="string" length="100"/>
    </class>
</hibernate-mapping>
No contexto de EJB, utilizando o persistence.xml, como eu faria este mapeamento? (sem utilizar anotações na classe). Algo assim:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	version="1.0">
	<persistence-unit name="TestEJB">
		<jta-data-source>java:/MySqlDS_test</jta-data-source>
		<properties>
			<property name="hibernate.hbm2ddl.auto" value="create-drop" />
		</properties>
		
		<class>entidades.Cliente</class>
		<!-- AQUI ENTRARIAM AS CUSTOMIZAÇÕES QUE PRECISO, COMO NOME DA COLUNA... SEMELHANTE AO ARQUIVO DE MAPEAMENTO DO HIBERNATE -->
    	
	</persistence-unit>
</persistence>

Posso fazer o mapeamento como faço em Hibernate, porém no persistence.xml?

10 Respostas

marcelocenerine

Olá,

De acordo com o livro Enterprise JavaBeans 3.0:

“If you do not want to use annotations to identify and map your entity beans, you can alternatively use an XML mapping file to declare this metadata. By default, the persistence provider will look in the META-INF directory for a file named orm.xml, or you can declare the mapping file in the element in the persistence.xml deployment descriptor.”

Sendo assim, seu mapeamento de entidades sem utilizar anotações ficaria mais ou menos assim:

<entity-mappings>
   <entity class="Cliente" access="PROPERTY">
      <table name="cliente"/>
      <attributes>
         <id name="id">
            <column name="cliente_id"
                    nullable="false"
                    column-definition="long"/>
            <generated-value strategy="AUTO">
         </id>
         <basic name="nome">
            <column name="nome"
                    nullable="false"
                    length="100"
		    column-definition="string"/>
         </basic>
      </attributes>
   </entity>
</entity-mappings>

Nunca cheguei a usar este tipo de mapeamento (XML) utilizando JPA.

andre_bento

Olá amigo…
Veja se te ajuda: http://docs.jboss.org/hibernate/core/3.5/reference/pt-BR/html/xml.html

Abraços

marcelocenerine

André,

Parece que ele está querendo fazer o mapeamento utilizando JPA (EJB 3.0+). Este link que vc postou mostra configurações próprias do Hibernate.

brccosta,

Faltou responder outra pergunta que vc fez. No seu persistence.xml vc deve utilizar apenas tags definidas no schema (http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd) que define a estrutura do arquivo. Sendo assim, vc tem fazer o mapeamento utilizando as tags do JPA. É possível setar algumas propriedades próprias da implementação que estiver sendo utilizada (Hibernate, por ex.), mas creio que não seja possível para efeitos de mapeamento de entidades.
Caso estiver errado, alguém me corrija por favor.

Att.

brccosta

Obrigado Marcelo e André.

Marcelo,

Fiz como falou, criei um arquivo Cliente.xml na pasta META-INF, configurei, pus a tag Cliente.xml no persistence.xml, porém ocorre o erro:

javax.persistence.PersistenceException: [PersistenceUnit: TestEJB] Unable to find XML mapping file in classpath: Cliente.xml

Tem alguma idéia?

marcelocenerine

brccosta,

Dentro do META-INF vc colocaria se fosse o orm.xml. Coloque esse arquivo Cliente.xml dentro da pasta source (src).

brccosta

Certo Marcelo, obrigado. Funcionou.

O persistece.xml ficou assim:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	version="1.0">
	<persistence-unit name="TestEJB">
		<jta-data-source>java:/MySqlDS_test</jta-data-source>
		
		<mapping-file>META-INF/orm.xml</mapping-file>
		
		<properties>
			<property name="hibernate.hbm2ddl.auto" value="create-drop" />
		</properties>
    	
	</persistence-unit>
</persistence>

Agora, ele não está gerando as tabelas, além da tag preciso incluir algo a mais? (por que com anotação, gerava normalmente...)

marcelocenerine

E se…(chute) vc colocar a linha:

após…

no seu persistence.xml???

brccosta

Valeu, pus agora. Nada feito, ele não gera as tabelas.

Se tiver mais alguma idéia…

brccosta

Gerou agora. O orm.xml estava errado.

O correto é:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0"
        xmlns="http://java.sun.com/xml/ns/persistence/orm"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd">
        
    <description>The minimal mappings for a persistent entity in XML.</description>
    
    <entity class="entidades.Cliente">
    <table name="clientes"/>   
       <attributes>  
         <id name="id">  
            <column name="cliente_id" />
            <generated-value strategy="AUTO"/>  
         </id>  
         <basic name="nome">  
            <column name="nome" />  
         </basic>  
      </attributes>
    </entity>
</entity-mappings>
brccosta
brccosta:
Senhores, Para a classe Cliente, abaixo:
public class Cliente implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private int id;
	private String nome;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}	
}
Mapeamento que faço com o Hibernate:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
    <class name="Cliente" table="cliente">
        <id name="id" column="cliente_id" type="long" unsaved-value="null">
            <generator class="increment"/>
        </id>
        <property name="nome" type="string" length="100"/>
    </class>
</hibernate-mapping>
No contexto de EJB, utilizando o persistence.xml, como eu faria este mapeamento? (sem utilizar anotações na classe). Algo assim:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	version="1.0">
	<persistence-unit name="TestEJB">
		<jta-data-source>java:/MySqlDS_test</jta-data-source>
		<properties>
			<property name="hibernate.hbm2ddl.auto" value="create-drop" />
		</properties>
		
		<class>entidades.Cliente</class>
		<!-- AQUI ENTRARIAM AS CUSTOMIZAÇÕES QUE PRECISO, COMO NOME DA COLUNA... SEMELHANTE AO ARQUIVO DE MAPEAMENTO DO HIBERNATE -->
    	
	</persistence-unit>
</persistence>

Posso fazer o mapeamento como faço em Hibernate, porém no persistence.xml?

Criado 29 de novembro de 2011
Ultima resposta 30 de nov. de 2011
Respostas 10
Participantes 3