miércoles, septiembre 13, 2006

El Otro blog

Más cosas en mi otro blog.

jueves, junio 29, 2006

one-to-one with Hibernate

Cuando tiene una relación uno a uno en la BD, se supone que ambas tablas tiene la misma llave.
Cuando Hibernate hace el mapeo crea una relación one-to-one y como tienen la misma llave, ambas tablas deberian usar el mismo Objeto PK.
Tip: Solemos usar herramientas para generar los mapeos y las clases Java a partir de la BD que no saben identificar el escenario antes descrito (no conozco ningúna herramienta capaz), para no invertirle demasido tiempo a ésto basta con que en la clase hija (de la relación de BD) use la misma PK que la padre, y de la PK que se generó para la clase hija hacer que extienda de la clase PK del padre:
Ejemplo:
Padre en la BD:
name="mx.net.vladpax.java.hbm.Familia" table="IEC_SUBDELEGACION">
name="comp_id" class="mx.net.vladpax.java.hbm.FamiliaPK">
name="cveFamilia" column="CVE_FAMILIA" type="java.lang.Integer" length="2"/>
name="cveTipoFamilia" column="CVE_TIPO_FAMILIA" type="java.lang.Integer" length="2"/>

Hija en la BD:
name="mx.net.vladpax.java.hbm.CasaXFam" table="IEC_MPIO_XSUBDEL" >
name="comp_id" class="
mx.net.vladpax.java.hbm.FamiliaPK">
name="
cveFamilia" column="CVE_FAMILIA" type="java.lang.Integer" length="2"/>
name="
cveTipoFamilia" column="CVE_TIPO_FAMILIA" type="java.lang.Integer" length="2"/>
Si vemos tenemos la misma clase, en la hija la gerramienta me generó una llamada: 'CasaXFamPK' e identica a SubdelegacionPK
La cual modifique de la siguiente forma:

public class CasaXFamPK extends FamiliaPK {

La excepción provacada cuando caemos en el error de no usar la misma clase para relaciones one-to-one es:
exception getting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) getter of paquete.java..nombreClaseHijaPK.?; nested exception is org.hibernate.PropertyAccessException: exception getting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) getter of paquete.java.nombreClaseHijaPK.?

martes, junio 20, 2006

Manejo de BLOB con Hibernate, Spring y Oracle

Clase Form
public class DocumentacionProbatoriaForm extends ValidatorForm{

/**
* Crea una instancia de clase DocumentacionProbatoriaForm.
*/
public DocumentacionProbatoriaForm() {
super();
// TODO Auto-generated constructor stub
}

/**
atributo para almacenar el rutaArchivo
*/
private String rutaArchivo;

/**
atributo para almacenar el archivo
*/
private FormFile archivo;

}// end class

Clase Action
public class DocumentacionProbatoriaMappingDispatchAction extends
MappingDispatchAction {


public ActionForward cargarDocumentoProbatorio(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {

if (logger.isInfoEnabled()) {
logger.info(" #### METODO: cargarDocumentoProbatorio");
}
DocumentacionProbatoriaForm forma = (DocumentacionProbatoriaForm) form;

FormFile docto = forma.getArchivo();


if (logger.isDebugEnabled()) {
logger.debug("size ::" + docto.getFileSize());
logger.debug("name ::" + docto.getFileName());
}//
DocumentacionProbatoriaVO vo = new DocumentacionProbatoriaVO();

vo.setCvePersona4modif(cvePersona4modif);
vo.setArchivo(docto.getFileData());


service = (DocumentacionProbatoriaService) super
.getBean("documentacionProbatoriaService");
// guardamos
vo = service.guardarDocumentacion(vo);
}//end method
}//end class


Implementación de la Clase de Servicio

public class DocumentacionProbatoriaServiceImpl implements
DocumentacionProbatoriaService {

private static Logger logger = Logger.getLogger(DocumentacionProbatoriaServiceImpl.class);

private DocProbatoriaModifDAO docProbatoriaModifDAO;

private FoliadorDAO foliadorDAO;

/**
* Crea una instancia de clase DocumentacionProbatoriaServiceImpl.
*/
public DocumentacionProbatoriaServiceImpl() {
super();
// TODO Auto-generated constructor stub
}

public DocumentacionProbatoriaVO guardarDocumentacion(
DocumentacionProbatoriaVO vo) throws BusinessException {

try {
Integer cveDocProbatoriaModif = this.foliadorDAO.getCveDocProbatoriaModif(vo.getCvePersona4modif());

DocProbatoriaModifPK pk = new DocProbatoriaModifPK();
pk.setCveDocProbatoriaModif(cveDocProbatoriaModif);
pk.setCvePersona4modif(vo.getCvePersona4modif());

DocProbatoriaModif docProba = new DocProbatoriaModif();
docProba.setComp_id(pk);
docProba.setDocProbatoria(this.creaBlob(vo.getArchivo()));
docProba.setDesDocProbatoria(vo.getDesDocProbatoria());
docProba.setDesNombreArchivo(vo.getNombreArchivo());

this.docProbatoriaModifDAO.insertar(docProba);

vo.setCveDocProbatoriaModif(cveDocProbatoriaModif);

// TODO Auto-generated method stub

}
catch (InfrastructureException e) {
logger.error(e.getMessage(), e);
}
return vo;
}

public DocumentacionProbatoriaVO recuperarDocumentacion(
DocumentacionProbatoriaVO vo) throws BusinessException {
try {
DocProbatoriaModifPK pk = new DocProbatoriaModifPK();
pk.setCveDocProbatoriaModif(vo.getCveDocProbatoriaModif());
pk.setCvePersona4modif(vo.getCvePersona4modif());
DocProbatoriaModif result= this.docProbatoriaModifDAO.findByPK(pk);
vo.setArchivo(this.toByteArray(result.getDocProbatoria()));
vo.setDesDocProbatoria(vo.getDesDocProbatoria());
vo.setNombreArchivo(result.getDesNombreArchivo());
return vo;
}
catch (InfrastructureException e) {
logger.error(e.getMessage(), e);
throw new BusinessException(e.getMessage(), e);
}
}


/**
* Recupera todos los documentos de una persona.
Recupera todos los datos excepto el BLOB.

* @param cvePersona4modif
* @return Lista con objetos DocumentacionProbatoriaVO.
* @throws BusinessException
*/
public List recuperaDocumentosXPersona(Integer cvePersona4modif) throws BusinessException{
List response = new ArrayList();

try {
if (logger.isDebugEnabled()){
logger.debug("cvePersona4modif :: " + cvePersona4modif);
}

final List temp = this.docProbatoriaModifDAO.recuperaListaDoctos( cvePersona4modif);
DocProbatoriaModif persitente = null;
DocumentacionProbatoriaVO vo = null;
if (temp!= null && !temp.isEmpty()){
final Iterator it = temp.iterator();
while(it.hasNext()) {
persitente =(DocProbatoriaModif) it.next();
vo = new DocumentacionProbatoriaVO();
vo.setArchivo(null);
vo.setCveDocProbatoriaModif(persitente.getComp_id().getCveDocProbatoriaModif());
vo.setCvePersona4modif(persitente.getComp_id().getCvePersona4modif());
vo.setDesDocProbatoria(persitente.getDesDocProbatoria());
vo.setNombreArchivo(persitente.getDesNombreArchivo());
if (logger.isDebugEnabled()){
logger.debug("DesNombreArchivo :: "
+ persitente.getDesNombreArchivo() + ", "
+ vo.getCveDocProbatoriaModif());
}
response.add(vo);
}
}

return response;
}
catch (InfrastructureException e) {
logger.error(e.getMessage(), e);
throw new BusinessException(e.getMessage(), e);
}
}

/**
* Elimina un documento.
* @param vo
* @throws BusinessException
*/
public void eliminarDocumento(DocumentacionProbatoriaVO vo) throws BusinessException{

try {
DocProbatoriaModifPK pk = new DocProbatoriaModifPK();



pk.setCveDocProbatoriaModif(vo.getCveDocProbatoriaModif());
pk.setCvePersona4modif(vo.getCvePersona4modif());

if (logger.isInfoEnabled()){
logger.info("pk :: " + GeneralSimeUtil.getObjectAsString(pk));
}

DocProbatoriaModif objetoPersistente = this.docProbatoriaModifDAO.findByPK(pk);

this.docProbatoriaModifDAO.eliminar(objetoPersistente);


if (logger.isDebugEnabled()) {
logger.debug("Eliminar [OK]");
}

}
catch (InfrastructureException e) {
logger.error(e.getMessage(), e);
throw new BusinessException(e.getMessage(), e);
}

}

/**
* Crea un BLob a apartir de un arrelog de bytes.
* @param input
* @return
*/
private Blob creaBlob(byte[] input){
return Hibernate.createBlob(input);
}


private byte[] toByteArray(Blob fromBlob) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
return toByteArrayImpl(fromBlob, baos);
}
catch (SQLException e) {
throw new RuntimeException(e);
}
catch (IOException e) {
throw new RuntimeException(e);
}
finally {
if (baos != null) {
try {
baos.close();
}
catch (IOException ex) {
}
}
}
}

private byte[] toByteArrayImpl(Blob fromBlob, ByteArrayOutputStream baos)
throws SQLException, IOException {
byte[] buf = new byte[4000];
InputStream is = fromBlob.getBinaryStream();
try {
for (;;) {
int dataSize = is.read(buf);

if (dataSize == -1)
break;
baos.write(buf, 0, dataSize);
}
}
finally {
if (is != null) {
try {
is.close();
}
catch (IOException ex) {
}
}
}
return baos.toByteArray();
}

/**
* Método que establece el valor del atributo docProbatoriaModifDAO.
*
* @param docProbatoriaModifDAO
* Valor a establecer en el atributo docProbatoriaModifDAO.
*/
public void setDocProbatoriaModifDAO(
DocProbatoriaModifDAO docProbatoriaModifDAO) {
this.docProbatoriaModifDAO = docProbatoriaModifDAO;
}

/**
* Método que establece el valor del atributo foliadorDAO.
*
* @param foliadorDAO
* Valor a establecer en el atributo foliadorDAO.
*/
public void setFoliadorDAO(FoliadorDAO foliadorDAO) {
this.foliadorDAO = foliadorDAO;
}

}//end class

Clase DAO
public class DocProbatoriaModifDAOImpl extends DAOSimeBaseImpl implements DocProbatoriaModifDAO {

/**
* Crea una instancia de clase DocProbatoriaModifDAOImpl.
*/
public DocProbatoriaModifDAOImpl() {
super();
// TODO Auto-generated constructor stub
}

public DocProbatoriaModif findByPK(DocProbatoriaModifPK pk) throws InfrastructureException {
return (DocProbatoriaModif) super.getHibernateTemplate().load(DocProbatoriaModif.class, pk);
}
public List recuperaListaDoctos(Integer cvePersona4modif) throws InfrastructureException{
List response = new ArrayList();

StringBuffer query = new StringBuffer();
query.append(" from DocProbatoriaModif as obj");
query.append(" where obj.comp_id.cvePersona4modif = ");
query.append(cvePersona4modif);

response = super.getHibernateTemplate().find(query.toString());

if (logger.isDebugEnabled()){
logger.debug("query :: " + query);
logger.debug("response.size() :: " + response.size());
}

return response;
}
}//end class

Clase VO
public class DocumentacionProbatoriaVO extends GenericSimeVO {

/**
*
*/
private static final long serialVersionUID = 1L;
private java.lang.Integer cvePersona4modif;
private java.lang.Integer cveDocProbatoriaModif;
/**
* Representación en un arreglo de bytes del archivo
*/
private byte[] archivo;
private java.lang.String nombreArchivo;
private java.lang.String desDocProbatoria;
}//end class

Clase de mapeo de HB:

public abstract class BaseDocProbatoriaModif implements Serializable {

// primary key
private mx.net.vlad.integracion.hbm.DocProbatoriaModifPK comp_id;

// fields
private java.sql.Blob docProbatoria;
private java.lang.String desDocProbatoria;
private java.lang.String desNombreArchivo;
}//end class




Nota
La clases de tipo bean obviamente tienen sus métodos get&set.
La clases que considero más importante y por lo tanto la he puesto intacta es el servicio, ya que hace la transformación del arreglo de bytes al objeto BLOB y viceversa.
La configuración de Spring no tiene nada de especial es por ello que no la pongo.


miércoles, febrero 15, 2006

Can't connect to X11 window server using '0.0' as the value of the DISPLAY

198 cd /usr/openwin/bin/
199 ./Xvfb :0 -screen 0 1152x900x8 &
200 export DISPLAY="127.0.0.1:0.0"
201 ./xclock

xclock no debe generar nigún error.

Ambiente:
SO: Sun Microsystems Inc. SunOS 5.9 Generic May 2002
Server: Weblogic 8.1 sp 3

En el startWeblogic
JAVA_OPTIONS="-Djava.awt.headless=true ${JAVA_OPTIONS}"

martes, diciembre 13, 2005

HqlToken Panic

Error:
CharScanner; panic: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
Inclusive tira al server.
Ambiente:
Hibernate 3
WL 8.1

Agregar la propiedad

org.hibernate.hql.classic.ClassicQueryTranslatorFactory

martes, noviembre 22, 2005

jueves, octubre 20, 2005

Tablas con nombre mafufos en Oracle

Hice unos cambios en mi BD de oracle y me genero tablas con nombre mafufos como BIN$4vcvloiRRxWzgEV2Xum/KA==$0 , las cual no permitian que me conectara con una herramienta que genera los hbm y las classes java, lo elimine con:
purge recyclebin
Salu2!

martes, octubre 18, 2005

Sequences Oracle

DROP SEQUENCE nombre_del_sequence;

CREATE SEQUENCE nombre_del_sequence
START WITH 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOORDER;


martes, octubre 11, 2005

Usa tu correo preferido en MSN messenger!

Usa tu correo preferido en MSN messenger !

A partir de hace poco (unos meses) surgió la posibilidad de ya no poder depender de cuentas como @hotmail.com ó @msn.com para utilizar el famoso mensajero MSN Messenger, gracias al servicio de Passport NET., puedes registrar tu correo favorito como por Ej. nano.precoz@dangerous-mind.com, les advierto que no usen una cuenta de correo inexistente, si no una que ya tienen, ¿Por qué? ya sabrán en los próximos párrafos de esta nota.

1. Abramos el IE (Internet Explorer u otro navegadores) y ponemos la url http://register.passport.com, es donde accedemos directamente a un formulario de registro.
En el formulario, lo primero que te pide es poner una dirección de correo existente (unas de las que tengas, en mi caso es la de
nano.precoz@dangerous-mind.com) de lo contrario vas a estar limitado al usar MSN, ya se darían cuenta en los próximos pasos del truco. Y luego completas lo común en el formulario como tu nombre, apellido, etc. como en el registro de cuentas de Hotmail.

Luego de completar y confirmar el formulario, el servicio te notificaría tu nuevo correo, para verificar si es correcto y luego continuar. En el tercer paso luego de presionar continuar, te muestra el panel de preferencias, servicios como para cambiar tu perfil en Passport NET, pero no necesitamos cambiar nada, finalmente cerramos el navegador.

3. Ahora vamos a iniciar sesión por primera vez en MSN Messenger con la nueva cuenta (Ej.
nano.precoz@dangerous-mind.com), al entrar el servicio de Passport NET te va a pedir que comprobes tu correo (para ver si existe el correo tuyo, de lo contrario no vas a poder personalizar tu nick aunque si agregar contactos o chatear (a esto lo llamo versión limitada).

4. ¿Cómo hacemos para comprobar la cuenta nueva?, abramos el correo en el Outlook o mediante el navegador depende del servicio de tu proveedor (en este caso es el correo de
nano.precoz@dangerous-mind.com), enseguida chequeamos el correo que te van a llegar tres e-mails, 1 mail con asunto: microsoft passport te da la bienvenida, los otros dos e-mails son para comprobar correo (son iguales pero en ingles y español)
Veamos dentro del cuerpo del mail con asunto: compruebe tu dirección de correo electrónico, el link de comprobar dirección de correo, y hagamos clic sobre el link y se abre una ventana en el IE para el OK.

Una vez que Passport NET te comprobó la dirección de correo, volvamos al MSN Messenger para reiniciar sesión, una vez reiniciado la sesión vamos a ver la versión completa de MSN Messenger (ahora si puedes poner el nick que quieras).

5. Ahora que tenemos la nueva cuenta en el MSN Messenger, vas tener la lista de contactos vacía.
Bueno hay dos formas de recuperar la lista de contactos si deseas tener los mismos contactos como en tu cuenta vieja de @hotmail.com o @msn.com, esto es simple.

a. Podes recuperar los contactos a mano, agregando 1 por 1 (mucho trabajo).

b. La mejor forma de recuperar es ir a iniciar sesión en la vieja cuenta de MSN Messenger, donde tienes la lista de amigos o familiares, vamos a Archivo/guardar la lista de contactos. la guardamos en un lugar de Windows (en mi caso la guardo en el escritorio para facilitar la tarea), cerramos la sesión para iniciar en la nueva cuenta de MSN, ir a Archivo/importar contactos desde un archivo), y importamos los mismos contactos. (Esto a veces no funciona del todo bien pero te ahorra trabajo, podrías intentarlos unas tres veces).

Salu2!

jueves, octubre 06, 2005

aumenta tu espacio en Hotmail.

De hecho la idea de este blog fue cuando vi otro donde sólo existía una sóla entrada.
Tal entrada especificaba los pasos para cambiar el tamaño de tu bandeja de correo de hotmail:
  1. Entra a tu cuenta de hotmail, y en la esquina superior derecha le das clic en Opciones.
  2. Después da clic en Mi Perfil.
  3. Cambia los siguientes datos:
    1. País: Estados Unidos.
    2. Estado: California
    3. Codigo Postal: 90210
  4. Despues de los cambios dale clic en el boton de Actualizar
  5. Te va a salir otra ventana y le das click en el boton Continuar
  6. Ahora en esta misma ventana entra a la siguiente direccion
  7. Escribe http://www.passport.net , sin cerrar la sesion
  8. En esta pagina en la parte de arriba dale clic en la opcion Servicios para usuarios.
  9. Te aparecera una nueva pagina donde hay dos columnas.
  10. En la primera columna hasta abajo dale clic en la opcion Cerrar mi cuenta de .NET Passport
  11. Te aparecera una nueva pagina dale clic en el boton Pongase en contacto con Hotmail.
  12. En la nueva pagina que aparece dale clic en el boton Cerrar mi cuenta
  13. Te apaecera una nueva pagina que dice Se ha cerrado tu cuenta y se ha programado su eliminación.
  14. Ahora en esta ventana entra a hotmail escibiendo http://www.hotmail.com y entra a tu correo como normalmente lo haces, escribiendo tu correo y tu contraseña sigue siendo la que usas siempre.
  15. Te aparecera una nueva ventana dale clic en el boton que dice Activar mi cuenta
  16. Depues te apareceran las condiciones de uso dale clic en el boton Acepto
  17. Te aparecera una ventana donde puedes seleccionar recibir los Boletines o la publicidad de hotmail si quieres puedes seleccionar alguno si no no hay problema, dale hasta abajo y le das clic en el boton Continuar.
  18. Ahora te aparecera una ventana donde puedes seleccionar recibir los Ofertas especiales si quieres puedes seleccionar alguno si no no hay problema, dale hasta abajo y le das clic en el boton Continuar.
  19. Y listo!!! ya tienes 25Megas para tu cuenta de hotmail y puedes mandar archivos adjuntos de 10Megas
  20. Y si no estas conforme con eso en 30 dias tu cuenta va a aumentar de 25Megas a 250Megas !!!
El blog es upgradeHotmail

Before

Pues ya había escrito una categoria similar dentro de mi blog anterior, pueden verlo aquí.