Hibernate e Middlegen

22 respostas
P

Boa tarde, você usa as ferramentas citadas no campo assunto?
Se você usa, será que vc poderia me ajudar a configurar minha máquina para executa-las, eu já baixei os arquivos mais não consigo configura-las… aguardo respostas… Paulo César 8)

22 Respostas

urubatan

o middlegen funciona somente chamado a partir de um script ANT

e se você disser qual o problema que esta tendo fica mais facil de tentar ajudar :slight_smile:

ricardolecheta

também queria saber como funciona :smiley:

ant middlegen, isto abre o middlegen, mas ele vem com umas tabelas prontas… de onde ele pegou estas tabelas?

como dizer para ele se conectar no banco que eu quiser e trazer as tabelas? :smiley:

obrigado

urubatan

aqui tem um exemplo então
segue uma task ant que utilizei em um projeto aqui, para gerar o mapeamento de uma tonelada de tabelas até é divertido, mas para pouca coisa, prefiro fazer na mão mesmo :-)

<target name="importdatabase" depends="init">
		<taskdef
		   name="middlegen"
		   classname="middlegen.MiddlegenTask"
		   classpathref="project.class.path"
		/>
		
		<middlegen
         appname="${name}"
         prefsdir="."
         gui="${var.gui}"
         databaseurl="${var.database.url}"
         initialContextFactory="${java.naming.factory.initial}"
         providerURL="${java.naming.provider.url}"
         datasourceJNDIName="${name}/database"
         driver="${var.database.driver}"
         username="${var.database.username}"
         password="${var.database.password}"
         schema="dbo"
      	>

			 <hibernate
			    destination="${dir.src}"
			    package="${var.site.package}.hibernate"
			 />
      	</middlegen>
	</target>

se o banco de dados não utilizar schemar (por exemplo, se for utilizar um MySQL ou firebird da vida), remover o parametro scheme

neste caso estava utilizando o middlegen só para gerar mapeamentos para hibernate, mas pode ser utilizado também para EJB, JDO, ....

não esquecer que os jars do middlegen devem estar na variavel de path utilizada na tag taskdef

isto ai vai mostrar a telinha do middlegen (na primeira execução é necessário, depois pode-se passar o parametro gui para false para uma execução automatica
depois de customizadas opções na tela do middlegen, e clicado no botão generate dele
esta task vai gerar os arquivos .hbm.xml, ai deve-se utilizar a ferramenta do proprio hibernate para gerar os .java a partir deste mapeamento

segue o arquivo build.properties que utilizo para setar as propriedades utilizadas neste exemplo acima

dir.merge = ./merge
dir.src = ./callcenter/WEB-INF/src
dir.lib_dir = ./callcenter/WEB-INF/lib
dir.lib_build_dir = ./build_lib
dir.html_dir = ./callcenter
dir.bin = ./callcenter/WEB-INF/classes
var.database.driver = com.sybase.jdbc2.jdbc.SybDriver
var.database.url = jdbc:sybase:Tds:host:porta/db
var.database.username = usuario
var.database.password = senha
var.gui = true
var.site.package = com.topazio.callcenter
java.naming.factory.initial = org.jnp.interfaces.NamingContextFactory
java.naming.provider.url = jnp://localhost:1099

é isto ai :-)

só uma coisa, a opção do middlegen de gerar formularios struts é furada, nada funciona :-(
só gera aquela excessão dizendo que o metodo não foi implementdo, não lembro o nome dela agora :-)

ricardolecheta

blz, funcionou :smiley:

P

“urubatan”:
o middlegen funciona somente chamado a partir de um script ANT

e se você disser qual o problema que esta tendo fica mais facil de tentar ajudar :-)

O hibernate, eu já entendi o conceito é um modulo de pesistencia, o que eu estou querendo é configurar minha maquina para usar o Middlegen, pois eu preciso de uma IDE para gerar meus XML’s, XDoclet’ e etc… As minhas classes javas eu estou gerando no Rational Rose. :oops:

urubatan

parece que tu ta tentando usar a ferramenta errada então,
o middlegen é uma ferramenta para geração de codigo a partir de engenharia reversa de um banco de dados,
a ideia dele é tu gerar o banco e ele gerar os .java para ti

ricardolecheta

como faz para inserir um relacionamento no middlegen ?

quando vc roda ele ele já verfica os relacinamentos do banco e trás pronto certo?

mas se existirem relacionamentos que eu queira colocar na hora eu consigo?

obrigado

urubatan

não consegue não, ele pega só os do banco,
mas nada impede de tu editar os .hbm.xml que ele gerar depois para adicionar um ou dois relacionamentos a mais :slight_smile:

P

Então urubatan… qual ferramenta vc me recomenda a usar para gerar meus XML’s e meus XDoclet’s?

urubatan

o XDoclet,
ele que foi feito para gerar codigo e deployment descriptors a partir de comentarios no codigo fonte

o que eu normalmente faço é o seguinte, comento o fonte, e rodo o xdoclet em cima disto para gerar os .hbm.xml, web.xml, views.properties, struts-config.xml, ejb-jar.xml, …

urubatan

como tu ta usando o Rational Rose, tu pode utilizar scripts dentro dele mesmo, para baseado em informações que tu coloca la dentro ele ja gerar estes comentarios para ti, ai é só rodar o xdoclet em cima disto

P

Você tem como me mandar um exemplo de algum XDoclet que vc já construiu? :?

urubatan
este build.xml utiliza o XDoclet para gerar os arquivos .hbm.xml do hibernate, o web.xml e atualizar o echema do banco de dados
<!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. -->
<project name="Patterns Portal" default="distrib" basedir=".">


  <!-- set global properties for this build -->
	<property name="dist" value="./portal/WEB-INF"/>
	<property name="bin" value="./portal/WEB-INF/classes"/>
	<property name="src" value="./src"/>
	<property name="j2src" value="./j2src"/>
	
	<target name="init">
    <!-- Create the dist directory structure used by compile
         and copy the deployment descriptors into it-->
		<path id="project.class.path">
			<pathelement location="${bin}"/>
			<fileset dir="./portal/WEB-INF/lib">
				<include name="**/*.jar"/>
			</fileset>
			<fileset dir="E:/JavaLibs/xdoclet-bin-1.2b2">
				<include name="**/*.jar"/>
			</fileset>
			<fileset dir="E:/jakarta-tomcat/common/lib">
				<include name="**/*.jar"/>
			</fileset>
		</path>
	
	</target>

	
	<target name="compile" depends="init">
		<javac 
			srcdir="${src}" 
			destdir="${bin}" 
			classpathref="project.class.path" 
			listfiles="yes" 
			depend="yes" 
			source="1.4" 
			debug="on"/>
		<javac 
			srcdir="${j2src}" 
			destdir="${bin}" 
			classpathref="project.class.path" 
			listfiles="yes" 
			depend="yes" 
			source="1.4" 
			debug="on"/>
	</target>
	
	<target name="hibernategen" depends="init">
		<taskdef 
			name="hibernatedoclet" 
			classname="xdoclet.modules.hibernate.HibernateDocletTask">
			<classpath 
				refid="project.class.path"/>
		</taskdef>
		<hibernatedoclet 
			destDir="${src}" 
			verbose="true" 
			mergedir="${src}" 
			addedtags="@xdoclet-generated at ${TODAY},@copyright The XDoclet Team,@author XDoclet,@version ${version}" 
			force="true">
			<fileset dir="${src}">
				<include name="**/*.java"/>
			</fileset>
			<hibernate version="2.0"/>
		</hibernatedoclet>
	</target>
	
	<target name="schemaupdate" depends="init">
		<taskdef 
			name="schemaupdate" 
			classname="net.sf.hibernate.tool.hbm2ddl.SchemaExportTask" 
			classpathref="project.class.path"/>
		
		<schemaupdate 
			properties="${src}/hibernate.properties" 
			quiet="no" >
			<fileset dir="${src}">
				<include name="**/*.hbm.xml"/>
			</fileset>
		</schemaupdate>
	</target>
	<target name="webgenerate" depends="init">
		<taskdef 
			classpathref="project.class.path" 
			classname="xdoclet.modules.web.WebDocletTask" 
			name="webdoclet"/>
		<webdoclet 
			excludedTags="@version,@author,@todo" 
			destDir="${dist}" 
			mergeDir="./merge" 
			verbose="true" 
			addedTags="@xdoclet-generated at ${TODAY},@copyright The XDoclet Team,@author XDoclet,@version ${version}">
			<fileset 
				dir="${src}" 
				includes="**/*.java"/>
			<deploymentdescriptor 
				Servletspec="2.3" 
				displayname="Patterns Portal" 
				distributable="true" 
				sessiontimeout="20"/>
			<jsptaglib 
				Jspversion="1.2" 
				shortname="patterns" 
				uri="http://www.patternsportal.com.br/taglib" 
				displayname="Patterns Poral TagLib" 
				filename="patterns.tld"/>
		</webdoclet>
	</target>
	<target name="distrib" depends="hibernategen,compile,webgenerate"></target>
</project>
baseado em comentarios nas classes como os abaixo:
/*
 * Created on 05/05/2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package br.com.usiinformatica.patterns.portal.data.pattern;

import br.com.usiinformatica.patterns.portal.data.Persistente;

/**
 * @author rodrigo
 *
 * @hibernate.class table = "VALOR"  dynamic-update = "true" dynamic-insert = "true" 
 */
public class Valor implements Persistente{
	private Integer id;
	private String valor;
	/**
	 * @return
	 * @hibernate.id generator-class="native" column="valor_id"
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @return
	 * @hibernate.property not-null="true" length="255" column="ds_valor"
	 */
	public String getValor() {
		return valor;
	}

	/**
	 * @param integer
	 */
	public void setId(Integer integer) {
		id = integer;
	}

	/**
	 * @param string
	 */
	public void setValor(String string) {
		valor = string;
	}

}
ou então esta:
/*
 * Created on 09/09/2003
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package br.com.usiinformatica.patterns.portal.listeners;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @author Rodrigo
 * @web.listener 
 */
public class UserLoggerListener implements HttpSessionListener {

	/* (non-Javadoc)
	 * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
	 */
	public void sessionCreated(HttpSessionEvent event) {
		HttpSession session = event.getSession();
	}

	/* (non-Javadoc)
	 * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
	 */
	public void sessionDestroyed(HttpSessionEvent event) {
	}
}
urubatan

mas o mais indicado é você olhar a documentação e os exemplos que vem com o proprio XDOclet e com o ANT

M

Galera, estou tentanto fazer o mapeamento de tabelas de um banco oracle com o Middlegen e simplismente ele aborta a operação sem mostrar erros. já tentei com outros bancos (firebird/ mysql) e não tive problemas.

Alguém pode me ajudar?

B

Bom dia turma, tudo bem!?

Preciso de uma ajudinha.

Utilizei a engenharia reversa do middlegen para gerar minhas classes Java e hbm.xml a partir de minha modelagem em um banco Oracle.
Para implementar os relacionamentos, nesse caso uma especialização, o Middlegen gerou a classe pai com atributos de coleção (SET) com os nomes dos filhos.

Estou tentando efetuar um teste para constatar a gravação no banco. Alguém sabe me dizer como popular essas coleções? Pesquisei na API Java sobre SET más não consegui resolver…

Obrigado a todos! Abraços.
Bruno

L
urubatan:
aqui tem um exemplo então segue uma task ant que utilizei em um projeto aqui, para gerar o mapeamento de uma tonelada de tabelas até é divertido, mas para pouca coisa, prefiro fazer na mão mesmo :-)
<target name="importdatabase" depends="init">
		<taskdef
		   name="middlegen"
		   classname="middlegen.MiddlegenTask"
		   classpathref="project.class.path"
		/>
		
		<middlegen
         appname="${name}"
         prefsdir="."
         gui="${var.gui}"
         databaseurl="${var.database.url}"
         initialContextFactory="${java.naming.factory.initial}"
         providerURL="${java.naming.provider.url}"
         datasourceJNDIName="${name}/database"
         driver="${var.database.driver}"
         username="${var.database.username}"
         password="${var.database.password}"
         schema="dbo"
      	>

			 <hibernate
			    destination="${dir.src}"
			    package="${var.site.package}.hibernate"
			 />
      	</middlegen>
	</target>

se o banco de dados não utilizar schemar (por exemplo, se for utilizar um MySQL ou firebird da vida), remover o parametro scheme

neste caso estava utilizando o middlegen só para gerar mapeamentos para hibernate, mas pode ser utilizado também para EJB, JDO, ....

não esquecer que os jars do middlegen devem estar na variavel de path utilizada na tag taskdef

isto ai vai mostrar a telinha do middlegen (na primeira execução é necessário, depois pode-se passar o parametro gui para false para uma execução automatica
depois de customizadas opções na tela do middlegen, e clicado no botão generate dele
esta task vai gerar os arquivos .hbm.xml, ai deve-se utilizar a ferramenta do proprio hibernate para gerar os .java a partir deste mapeamento

segue o arquivo build.properties que utilizo para setar as propriedades utilizadas neste exemplo acima

dir.merge = ./merge
dir.src = ./callcenter/WEB-INF/src
dir.lib_dir = ./callcenter/WEB-INF/lib
dir.lib_build_dir = ./build_lib
dir.html_dir = ./callcenter
dir.bin = ./callcenter/WEB-INF/classes
var.database.driver = com.sybase.jdbc2.jdbc.SybDriver
var.database.url = jdbc:sybase:Tds:host:porta/db
var.database.username = usuario
var.database.password = senha
var.gui = true
var.site.package = com.topazio.callcenter
java.naming.factory.initial = org.jnp.interfaces.NamingContextFactory
java.naming.provider.url = jnp://localhost:1099

é isto ai :-)

só uma coisa, a opção do middlegen de gerar formularios struts é furada, nada funciona :-(
só gera aquela excessão dizendo que o metodo não foi implementdo, não lembro o nome dela agora :-)

Olá brother, será que você poderia explicar passo a passo como é que funciona esse Middlegen? tipo quais são os jars necessários e quais os arquivos que tenho de configurar? se tenho de criar algum diretorio especifico e tal. Heeeeellllllllllpe me please....

nbluis

Cara, se você ver a data do tópico vai notar que isso não é mais usado.

Se o que quer é ORM utilize JPA.

L

nbluis:
Cara, se você ver a data do tópico vai notar que isso não é mais usado.

Se o que quer é ORM utilize JPA.

Mas como faço para gerar o mapeamento apartir de um banco de dados, com esse JPA? você tem algum tutorial para me indicar? eu só estou tentando utilizar Middlegen por que vi isso no livro Hibernate em Ação…

nbluis

Gerar mapeamento a partir do banco de dados ???
hummmmm…
hammmmmmmmmmm…
é…
realmente não sei.
mas eu particularmente não faria isso.

já deu uma olhada para entender o que é JPA ?

L

nbluis:
Gerar mapeamento a partir do banco de dados ???
hummmmm…
hammmmmmmmmmm…
é…
realmente não sei.
mas eu particularmente não faria isso.

já deu uma olhada para entender o que é JPA ?

Bom, eu gero o mapeamento na mão mesmo em annotations, mas estou com um caso aqui em que preciso que ele gere o mapeamento pra mim e apartir desse mapeamento, utilizando o hbm2java para gerar os pojos. Bom se você pegar o capítulo 9 do livro vai entender melhor o que estou querendo, vou dar uma olhada em JPA, você tem algum link ou algum pdf sobre o assunto para me indicar? Obrigado…

nbluis

Cara eu não tenho(ou pelo menos não lembro de ter) nada aqui comigo.
Mas material pela internet ai tem aos montes.
Tem esse link até.
Da documentação de jpa.

http://java.sun.com/developer/technicalArticles/J2EE/jpa/

Até.

Criado 11 de setembro de 2003
Ultima resposta 6 de mar. de 2008
Respostas 22
Participantes 7