viernes, 3 de mayo de 2013

Eliminación de datos en un solo lado de una relación ManyToMany (JPA - Hibernate)

Escenario

JPA 2.0
Hibernate 4.2.0


Tenemos la Clase A y Clase B, que representan el mapeo de las entidades: A, B y A_B. En una relación de muchos a muchos.


Implementación

Propietario: Clase B, por no tener mappedBy


Clase A {
...
private List<B> relAB;
...
    @ManyToMany(mappedBy = "relBA", fetch = FetchType.LAZY)
    public List<B> getRelAB() {
        return this.relAB;
    }

    public void setRelAB(List<B> relAB) {
        this.relAB = relAB;
    }
...
}

Clase B {
...
private List<A> relBA;
 ...
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "idB") }, inverseJoinColumns = { @JoinColumn(name = "idA") })
    public List<A> getRelBA() {
        return this.relBA;
    }

    public void setRelBA(List<A> relBA) {
        this.relBA = relBA;
    }
...
}

Al colocar en el mapeo de la entidad cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }, le decimos al Hibernate que cuando sea llamado cualquiera de los tipos de cascade definidos (excepto REMOVE)  no se eliminara los registros contenidos en la entidad A. Asimismo se realizaran el resto de las operaciones segun como corresponda (insert y update en las entidades A, B y A_B, el delete solo se efectuara en B y A_B)

jueves, 2 de mayo de 2013

Consultas ejecutadas en Shared SQL Area (Shared Pool)

Escenario

Oracle Database 11g Release 11.2.0.2.0

Implementación

Consulta para obtener información sobre las sentencias SQL y el usuario que las ha ejecutado.
La información mostrada corresponde al Shared SQL Area dentro del Shared Pool, por lo que Oracle ira desapareciendo las consultas menos utilizadas.

select distinct vs.sql_text, vs.sharable_mem,
vs.persistent_mem, vs.runtime_mem, vs.sorts,
vs.executions, vs.parse_calls, vs.module,
vs.buffer_gets, vs.disk_reads, vs.version_count,
vs.users_opening, vs.loads,
to_char(to_date(vs.first_load_time,
'YYYY-MM-DD/HH24:MI:SS'),'MM/DD HH24:MI:SS') first_load_time,
rawtohex(vs.address) address, vs.hash_value hash_value ,
rows_processed , vs.command_type, vs.parsing_user_id ,
OPTIMIZER_MODE , au.USERNAME parseuser
from v$sqlarea vs , all_users au
where (parsing_user_id != 0) AND
(au.user_id(+)=vs.parsing_user_id)
and (executions >= 1) order by buffer_gets/executions desc