Tema 16 - Acceso a Base de Datos Usando JPA

download Tema 16 - Acceso a Base de Datos Usando JPA

of 55

Transcript of Tema 16 - Acceso a Base de Datos Usando JPA

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    1/55

    ITSON Manuel Domitsu Kono

    Tema 16

    Acceso a Bases de Datos Usando JPAEn el Tema 15: Acceso a base de Datos Usando JDBC vimos que Java nos permitecrear aplicaciones que accedan a base de datos usando un protocolo en la forma deuna API: la API JDBC. Una de las metas de JDBC era la de aislar el cdigo de laaplicacin de las diferentes implementaciones de manejadores de base de datos,permitiendo substituir un manejador de bases de datos por otro sin modificar una lneade cdigo. Desafortunadamente JDBC no proporciona una completa independencia delos manejadores de bases de datos ya que hay ciertas diferencias entre esasimplementaciones que la JDBC no puede manejar y que nos obliga a hacer

    modificaciones en la aplicacin si se cambia de un manejador de base de datos a otro.

    Desajuste de Impedancias

    En el modelo del dominio, que es el que usamos en el diseo de nuestra aplicacin,tenemos clases, las bases de datos tienen tablas. Otro de los problemas de JDBC es eltrabajo que debe hacer el programador para convertir un objeto a un rengln de unatabla y visceversa. Esa dificultad en la traduccin entre una clase y una tabla se debe alas diferencias entre ambos modelos. A esas diferencias se le conoce como Desajuste

    de impedancias y se ilustran en la tabla 16.1:

    Tabla 16.1 Desajuste de Impedancias entre los mundos OO y RelacionalObjetos, clases Tablas, renglones

    Atributos, propiedades Columnas

    Identidad Llave primaria

    Relacin/referencia a otra entidad Llave fornea

    Herencia/polimorfismo No soportado

    Mtodos Indirectamente: Lgica SQL, procedimientos almacenados, triggers

    Cdigo portable No necesariamente portable, dependiente del vendedor.

    La API de Persistencia de Java, JPALa JPA es una capa de software por encima de JDBC que busca redicirle alprogramador de la tarea de conversin entre el mundo OO y el mundo relacionalproveyendo de los siguientes servicios:

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    2/55

    626 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Realiza el Mapeo Objeto - Relacional, esto es establece cmo persistir losobjetos en una base de datos.

    Persiste los objetos a la base de datos. Realiza las operaciones de altas, bajas ycambios de objetos en la base de datos.

    Permite la bsqueda y recuperacin de objetos de la base de datos mediante su

    propio Lenguaje de Consulta de Persistencia de Java o SQL.

    Mapeo Objeto Relacional

    El Mapeo Objeto Relacional, ORM, es un procedimiento para establecer en queregistro de una tabla se almacena cada objeto y en que columna se almacenar cadaatributo. Adicionalmente, ORM establece cmo se mapean las relaciones entre losobjetos incluyendo la herencia.

    Mapeo Uno a Uno

    En una relacin uno a uno unidireccional, un objeto de una clase tiene una referencia acuando mucho otro objeto de otra clase. Por ejemplo, un cliente de una empresa puedetener una cuenta de usuario en esa empresa para acceder a su extranet. Aqusupondremos que un cliente slo puede tener como mximo una cuenta de usuario enesa empresa. Las clases Cl i ent ey Usuar i oson las siguientes:

    publ i c cl ass Cl i ent e {pr ot ected St r i ng cl i ent eI d;pr otected St r i ng nombr e;pr ot ect ed St r i ng di r ecci onpr ot ect ed Usuar i o usuar i o;

    }

    publ i c cl ass Usuar i o {pr ot ect ed St r i ng usuar i oI d;pr ot ect ed St r i ng cont r asena;pr ot ected St r i ng r ol ;

    }

    Las clases anteriores se mapean a dos tablas relacionadas por una llave foranea de lasiguiente manera:

    clientes

    cl i ent eI d not nul l , pr i mar y key var char ( 10)nombr e not nul l , var char( 35)di r ecci on not nul l , var char ( 35)usuar i oI d not nul l , var char ( 10)

    f or ei ng key ( usuar i os( usuar i oI d) )

    usuarios

    usuar i oI d not nul l , pr i mar y key var char ( 10)

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    3/55

    Tema 16 Acceso a Base de Datos Usando JPA 627

    ITSON Manuel Domitsu Kono

    cont r asena not nul l , var char ( 10)r ol not nul l , var char ( 20)

    Si queremos que la relacin sea bidireccional, dos objetos de diferentes clases tienen

    una referencia al otro objeto. Si para las clases Cl i ent ey Usuar i odeseamos que larelacin sea bidireccional tendremos que su cdigo es el siguiente:

    publ i c cl ass Cl i ent e {pr ot ected St r i ng cl i ent eI d;pr otected St r i ng nombr e;pr ot ect ed St r i ng di r ecci onpr ot ect ed Usuar i o usuar i o;

    }

    publ i c cl ass Usuar i o {pr ot ect ed St r i ng usuar i oI d;pr ot ect ed St r i ng cont r asena;pr ot ected St r i ng r ol ;pr ot ected Cl i ent e cl i ent e;

    }

    Mapeo Muchos a Uno

    En una relacin muchos a uno unidireccional, muchos objetos de una clase tiene unareferencia a cuando mucho otro objeto de otra clase. Por ejemplo, varios medios(canciones o pelculas) pueden tener el mismo gnero. Las clases Medi oy Generoson las siguientes:

    publ i c cl ass Medi o {pr ot ect ed St r i ng cl ave;

    protected St r i ng t i t ul o;prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;pr otect ed Date f echa;

    }

    publ i c cl ass Gener o {pr otect ed St r i ng cveGenero;pr otected St r i ng nombr e;pr otect ed char t i poMedi o;

    }

    Las clases anteriores se mapean a dos tablas relacionadas por una llave foranea de la

    siguiente manera:

    medios

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt eger

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    4/55

    628 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    f echa Dat e

    generos

    cveGener o not nul l , pr i mary key var char( 10)nombr e not nul l , var char( 20)t i poMedi o not nul l , char

    Mapeo Uno a Muchos

    En una relacin uno a muchos o muchos a uno bidireccional, el lado de uno de larelacin tiene una referencia a una coleccin (Col l ect i on, Li st o Set ) de objetosde la otra clase. Por ejemplo, las clases Canci ony Generocon una relacin uno amuchos tendran la forma siguiente:

    publ i c cl ass Medi o {pr ot ect ed St r i ng cl ave;

    protected St r i ng t i t ul o;prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;pr otect ed Date f echa;

    }

    publ i c cl ass Gener o {pr otect ed St r i ng cveGenero;pr otected St r i ng nombr e;pr otect ed char t i poMedi o;Li st l i st amedi os;

    }

    Las clases anteriores se mapean a las mismas tablas de la relacin muchos a uno.

    Mapeo Muchos a Muchos

    En una relacin muchos a muchos, dos objetos de diferente clase tienen unareferencia a una coleccin de objetos de la otra clase. Por ejemplo, una cancin puede

    estar en varios lbumes y un lbum puede tener varias canciones. Las clases Canci ony Al bumson las siguientes:

    publ i c cl ass Canci on {pr ot ect ed St r i ng cl ave;

    protected St r i ng t i t ul o;prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;pr otect ed Date f echa;pr otected Li st l i st aAl bumes;

    }

    publ i c cl ass Al bum {pr otected St r i ng cveAl bum;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    5/55

    Tema 16 Acceso a Base de Datos Usando JPA 629

    ITSON Manuel Domitsu Kono

    pr otected St r i ng nombr e;pr otect ed Li st l i st aCanci ones;

    }

    Las clases anteriores se mapean a dos tablas relacionadas por una tabla conjunta de lasiguiente manera:

    canciones

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat ecveAl bum not nul l , var char ( 10)

    albumes

    cveAl bum not nul l , pr i mar y key var char ( 10)

    nombr e not nul l , var char( 20)cl ave not nul l , var char ( 10)

    canciones_albumes

    cl ave not nul l , pr i mar y key var char ( 10)f or ei ng key ( canci ones( cl ave) )

    cveAl bum not nul l , pr i mar y key var char ( 10)f orei ng key ( al bumes( cveAl bum) )

    Herencia

    El concepto de herencia no tiene un equivalente directo en el mundo relacional. Sinembargo hay varias estrategias para mapear la herencia entre clases a tablas:

    Una sola tabla

    Tablas conjuntas

    Una tabla por clase

    Para ilustrar las tres estrategias, consideremos las siguientes tres clases:

    publ i c cl ass Medi o {pr ot ect ed St r i ng cl ave;protected St r i ng t i t ul o;

    prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;pr otect ed Date f echa;

    }

    publ i c cl ass Canci on ext ends Medi o {pr i vat e St r i ng i nt er pr et e;pr i vat e St r i ng aut or ;pr i vat e d St r i ng al bum;

    }

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    6/55

    630 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    publ i c cl ass Pel i cul a extends Medi o {pr i vat e St r i ng actor1;pr i vat e St r i ng actor2;pr i vat e St r i ng di rect or;

    }

    Estrategia de una Sola Tabla

    En esta estrategia, todas las clases de la jerarqua se mapean a una sola tabla. Losdiferentes objetos de la jerrqua se identifican usando una columna especial llamadacolumna descriminadora que contiene un valor nico para cada tipo de objeto en unregistro dado:

    medios

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)tipoMedio not null, varchar(1)

    cveGener o not nul l , var char( 10)f orei ng key ( generos( cveGener o) )

    dur aci on not nul l , i nt egerf echa Dat ei nt er pr et e var char ( 35)aut or var char ( 35)al bum var char ( 20)act or 1 var char ( 35)act or 2 var char ( 35)di r ect or var char ( 35)

    En este caso t i poMedi oes la columna descriminadora y contendr un valor diferentepara cada tipo de objeto: Canci ono Pel cul a. Las columnas que no corresponden aun objeto en particular teinen valores NULL. Esta estrategia es simple de usar. Sinembargo tiene la desventaja de desperdiciar espacio debido a todos esos valores

    NULL. Adicionalmente todas las columnas correspondientes a los atributos exclusivasde las clases hijas no pueden ser obligatorias, NOT NULL.

    Estrategia de Tablas Conjuntas

    En esta estrategia, se utilizan relaciones uno a uno para modelar la herencia. En esta

    estrategia se crean tablas separadas para cada clase de la jerarqua y relacionar losdescendientes directos en la jerarqua con relaciones uno a uno:

    medios

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)tipoMedio not null, varchar(1)

    cveGener o not nul l , var char( 10)

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    7/55

    Tema 16 Acceso a Base de Datos Usando JPA 631

    ITSON Manuel Domitsu Kono

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat ecanciones

    cl ave not nul l , pr i mar y key var char ( 10)f or ei ng key (medi os( cl ave) )

    i nt er pr et e var char ( 35)aut or var char ( 35)al bum var char ( 20)

    peliculas

    cl ave not nul l , pr i mar y key var char ( 10)f or ei ng key (medi os( cl ave) )

    act or 1 var char ( 35)act or 2 var char ( 35)di r ect or var char ( 35)

    En esta estrategia se sigue utilizando la columna descriminadora para distinguir losdiferentes tipos de las jerarquas Aunque esta estrategia es la mejor en trminos de laperspectiva de diseo, en trminos de desempeo es peor que la de una sola tabla porque requiere de tablas conjuntas para las consultas.

    Estrategia de una Tabla por Clase

    En esta estrategia, cada una de las clases concretas (no abstractas) de la jerarqua sealmacena en su propia tablay no hay relaciones entre las tablas:

    medios

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat e

    cancionescl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt eger

    f echa Dat ei nt er pr et e var char ( 35)aut or var char ( 35)al bum var char ( 20)

    peliculas

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    8/55

    632 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat eact or 1 var char ( 35)act or 2 var char ( 35)di r ect or var char ( 35)

    Esta estrategia aunque es la ms fcil de entender, es la peor desde el punto de vistade objetos y relacional. En la especificacin de JPA esta estrategia es opcional y puedeno estar soportada por una implementacin.

    Entidades

    En la seccin anterior se estableci como pueden mapearse las clases y objetos atablas y registros de tal manera que se puedan persistir los objetos en una base de

    datos. En JPA, una clase cuyo estado (valores de sus atributos) van a persistirse enuna tabla, se llama Entidad. Para poder persistir un objeto, el provedor de lapersistencia debe saber lo siguiente:

    La tabla en la que se va a persistir el objeto

    Cules atributos se van a persitir y en qu columnas de la tabla

    Cmo se establece la identidad del objeto a persistir

    Qu relaciones tiene este objeto con otros objetos de otras clases que tambinse van a persistir

    Esta informacin se la agregamos a nuestra entidad mediante una serie de anotaciones

    que se vern a continuacin:

    @Entity

    La anotacin @Entity marca a una clase como una entidad cuyo estado ser persistidoen una base de datosy que ser identificado univocamente. La sintaxis de estaanotacin es:

    @Entity

    public class nomEntidad {

    ...

    }

    Todas las entidades no abstractas deben tener un constructor vaco pblico oprotegido.

    Una entidad puede heredar de otra entidad o inclusive de una clase que no sea unaentidad. Si la clase padre es una entidad, tambin su estado se estado se guarda alpersistir a la clase hija. Si la clase padre no es una entidad su estado no se guarda.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    9/55

    Tema 16 Acceso a Base de Datos Usando JPA 633

    ITSON Manuel Domitsu Kono

    @Table

    Esta anotacin permite mapear el nombre de la entidad al nombre de la tabla en la que

    se persistirn los objetos de esta entidad. Esta anotacin es opcional. Si se omite seasume que el nombre de la entidad es el nombre de la tabla. Su sintaxis es:

    @Ent i t y@Table(name = nomTabla)

    publ i c cl ass nomEnt i dad {. . .

    }

    Donde nomTabla es el nombre de la tabla en la que se persistirn los objetos de laentidad.

    @Column

    Esta anotacin permite mapear el nombre de un atributo o propiedad de una entidad ala columna de la tabla en la que se persistir. Esta anotacin es opcional. Si se omitese asume que el nombre del atributo o propiedad es el nombre de la columna. Susintaxis es:

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    @Column(name = nomColumna)

    modificadorAcceso tipo nomAtributo. . .

    }

    @Id

    Cada instancia de una identidad debe ser identificada unvocamente. La anotacin @I destablece el campo o propiedad de una entidad como la identidad de una entidad. Sucorrespondiente columna en la tabla ser la llave primaria de la tabla.

    El atributo o propiedad anotado como la identidad de la entidad debe ser un tipo

    primitivo, una clase envolvente, un tipo serializable comoj ava. l ang. St r i ng,j ava.ut i l . Dat e, yj ava. sql . Dat e. Adicionalmente no es recommendable usar comoidentidad un tipo flotante: float o double ni sus clases envolventes por el problema deprecisin.

    La sintaxis de la anotacin @I des:

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    10/55

    634 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    @I d@Column(name = nomLlavePrimaria)

    modificadorAcceso tipo nomAtributoIdentidad

    . . .}

    El siguiente cdigo ilustra las diferentes anotaciones vistas:

    @Ent i t y@Tabl e( name = "generos" )publ i c cl ass Gener o i mpl ement s Ser i al i zabl e {

    @I d@Basi c( opt i onal = f al se)@Col umn( name = "cveGener o" )pr i vat e St r i ng cveGener o;

    @Basi c( opt i onal = f al se)@Col umn( name = "nombr e" )pr i vat e St r i ng nombr e;

    @Basi c( opt i onal = f al se)@Col umn( name = " t i poMedi o" )pr i vat e char t i poMedi o;

    En este ejemplo la anotacin @Basi c( opt i onal = f al se) establece que lacolumna asociada no es opcional.

    Las tablas correspondientes a las entidades anteriores son:

    generos

    cveGener o not nul l , pr i mary key var char( 10)nombr e not nul l , var char( 20)t i poMedi o not nul l , char

    Anotaciones para la Relacin Uno a Uno

    En una relacin uno a uno unidireccional, la entidad que tiene la referencia a la otra

    entidad se dice que es la duea de la relacin. En una relacin uno a unobidireccional una de las entidades se dice que es la duea de la relacin. La tablacorrespondiente a la entidad duea de la relacin es la que tiene la llave fornearelaciondola a la otra tabla.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    11/55

    Tema 16 Acceso a Base de Datos Usando JPA 635

    ITSON Manuel Domitsu Kono

    @OneToOne

    Esta anotacin se usa para marcar las relaciones uno a uno uni- y bidireccionales. Estaanotacin se emplea en el atributo o propiedad que es la referencia a la otra entidad.Su sintaxis es:

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@OneToOne

    modificadorAcceso tipo nomReferencia;

    ...}

    @JoinColumn

    La anotacin @J oi nCol umnse emplea en el atributo o propiedad con la anotacin@OneToOneen la entidad que es duea de la relacin y permite establecer el nombrede la llave fornea en una tabla y el nombre de la columna a la que hace referencia enla otra tabla con la que est relacionada.Esa columna debe ser una llave primaria onica. Su sintaxis es:

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@OneToOne

    @JoinColumn(name = nomLlaveForanea,

    referencedColumnName=nomColumnaReferenciada)modificadorAcceso tiponomReferencia;

    ...}

    Por ejemplo, en las entidades siguientes se tiene una relacin uno a uno unidireccional

    entre un cliente y su cuenta de usuario. La entidad Cl i ent ees la duea de la relacin.

    @Ent i t y@Tabl e(name = cl i ent es)publ i c cl ass Cl i ent e {

    @I dpr ot ected St r i ng cl i ent eI d;

    pr otected St r i ng nombr e;pr ot ect ed St r i ng di r ecci on

    @OneToOne@J oi nCol umn(name = usuar i oI d, r ef erencedCol umnName=usuar i oI d)pr ot ect ed Usuar i o usuar i o;

    . . .}

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    12/55

    636 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    @ent i t y@Tabl e( name = usuar i os)publ i c cl ass Usuar i o {

    @I dpr ot ect ed St r i ng usuar i oI d;pr ot ect ed St r i ng cont r asena;pr ot ected St r i ng r ol ;

    . . .}

    Las tablas correspondientes a las entidades anteriores son:

    clientes

    cl i ent eI d not nul l , pr i mar y key var char ( 10)nombr e not nul l , var char( 35)di r ecci on not nul l , var char ( 35)usuar i oI d not nul l , var char ( 10)

    f or ei ng key ( usuar i os( usuar i oI d) )

    usuarios

    usuar i oI d not nul l , pr i mar y key var char ( 10)cont r asena not nul l , var char ( 10)r ol not nul l , var char ( 20)

    Si la relacin es bidireccional, tambin debemos agregarle la anotacin @OneToOnealatributo que contiene la relacin inversa en la entidad relacionada, slo que en estecaso la anotacin tiene la siguiente sintaxis:

    @Ent i t y

    @Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@OneToOne(mappedBy = nomReferencia)

    modificadorAcceso tiponomReferenciaInversa;

    ...}

    El parmetro mappedByes el nombre de la referencia a esta entidad en la entidadduea de la relacin.

    El siguiente cdigo muestra el ejemplo anterior modificado para que la relacin sea

    bidireccional.

    @Ent i t y@Tabl e(name = cl i ent es)publ i c cl ass Cl i ent e {

    @I dpr ot ected St r i ng cl i ent eI d;pr otected St r i ng nombr e;pr ot ect ed St r i ng di r ecci on

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    13/55

    Tema 16 Acceso a Base de Datos Usando JPA 637

    ITSON Manuel Domitsu Kono

    @OneToOne@J oi nCol umn(name = usuar i oI d, r ef erencedCol umnName=usuar i oI d)pr ot ect ed Usuar i o usuar i o;

    }

    @ent i t y@Tabl e( name = usuar i os)publ i c cl ass Usuar i o {

    @I dpr ot ect ed St r i ng usuar i oI d;pr ot ect ed St r i ng cont r asena;pr ot ected St r i ng r ol ;

    @OneToOne( mappedBy = usuar i o)pr ot ected Cl i ent e cl i ent e;

    }

    Las tablas correspondientes a las entidades anteriores son las mismas que las de las

    entidades con una relacin unidireccional:

    Anotaciones para la Relacin Muchos a Uno y Uno aMuchos

    En una relacin muchos a uno o uno a muchos, la entidad que representa el ladomuchos de la relacin, es la entidad duea de la relacin. La tabla correspondientea la entidad duea de la relacin es la que tiene la llave fornea relaciondola a la otratabla.

    @ManyToOne

    Esta anotacin se usa para marcar las relaciones muchos a uno y uno a muchos en laentidad que es duea de la relacin. Esta anotacin se emplea en el atributo opropiedad que es la referencia a la otra entidad. Su sintaxis es:

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@ManyToOne

    modificadorAcceso tipo nomReferencia;...}

    @JoinColumn

    La anotacin @J oi nCol umnse emplea en el atributo o propiedad con la anotacin@OneToOneen la entidad que es duea de la relacin y permite establecer el nombre

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    14/55

    638 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    de la llave fornea en una tabla y el nombre de la columna a la que hace referencia enla otra tabla con la que est relacionada.Esa columna debe ser una llave primaria onica. Su sintaxis es la misma que el la relacin uno a uno.

    Por ejemplo, en las entidades siguientes se tiene una relacin muchos a uno

    unidireccional entre un medio y un gnero. La entidad Medi oes la duea de larelacin.

    @Ent i t y@Tabl e( name = medi os)publ i c cl ass Medi o {

    @I dpr ot ect ed St r i ng cl ave;protected St r i ng t i t ul o;

    @ManyToOne@J oi nCol umn( name = cveGenero,

    r ef erencedCol umnNane = cveGener o)

    prot ect ed Genero gener o;

    pr ot ect ed i nt dur aci on;pr otect ed Date f echa;. . .

    }

    @Ent i t y@Tabl e( name = generos)publ i c cl ass Gener o {

    @I dpr otect ed St r i ng cveGenero;pr otected St r i ng nombr e;pr otect ed char t i poMedi o;

    }

    Las tablas correspondientes a las entidades anteriores son:

    medios

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat e

    generos

    cveGener o not nul l , pr i mary key var char( 10)nombr e not nul l , var char( 20)t i poMedi o not nul l , char

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    15/55

    Tema 16 Acceso a Base de Datos Usando JPA 639

    ITSON Manuel Domitsu Kono

    @OneToMany

    Esta anotacin se usa para marcar la relacin uno a muchos (o muchos a unobidireccional) en la entidad que no es la duea de la relacin. Esta anotacin se empleaen el atributo o propiedad que es una referencia a a una coleccin (Col l ect i on, Li st

    o Set ) de objetos de la otra entidad. Su sintaxis es:

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@OneToMany(mappedBy = nomReferencia)

    modificadorAcceso tipo nomReferenciaColeccin;

    ...}

    Por ejemplo, si la relacin entre un medio y un gnero se hace bidireccional se tiene lo

    siguiente.

    @Ent i t y@Tabl e( name = medi os)publ i c cl ass Medi o {

    @I dpr ot ect ed St r i ng cl ave;protected St r i ng t i t ul o;

    @ManyToOne@J oi nCol umn( name = cveGenero,

    r ef erencedCol umnNane = cveGener o)prot ect ed Genero gener o;

    pr ot ect ed i nt dur aci on;pr otect ed Date f echa;. . .

    }

    @Ent i t y@Tabl e( name = generos)publ i c cl ass Gener o {

    @I dpr otect ed St r i ng cveGenero;pr otected St r i ng nombr e;pr otect ed char t i poMedi o;

    @OneToMany( mappedBy = gener o)Li st l i st amedi os;. . .

    }

    Las tablas correspondientes a las entidades anteriores son las mismas que las de lasentidades con una relacin muchos a uno unidireccional.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    16/55

    640 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Anotaciones para la Relacin Muchos a Muchos

    En una relacin muchos a muchos, la entidad que es duea de la relacinesarbitraria.

    @ManyToMany

    Esta anotacin se usa para marcar las relaciones muchos a muchos. Esta anotacin seemplea en el atributo o propiedad que es la referencia a la otra entidad. Su sintaxis es:

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@ManyToMany

    modificadorAcceso tipo nomReferencia;

    ...

    }

    @JoinTable

    La anotacin @J oi nTabl ese emplea en el atributo o propiedad con la anotacin@ManyToManyen la entidad que es duea de la relacin y permite establecer elnombre de la tabla conjunta y sus columnas. Esas columnas estn relacionadas con lasllaves primarias de las tablas correspondientes a las entidades de la relacin. Susintaxis es:

    @Ent i t y

    @Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@ManyToMany

    @JoinTable(name = nomTablaConjunta,

    joinColumns = {

    @JoinColumn(name = nomLlaveForanea,

    referencedColumnName = nomColumnaReferenciada),

    ...

    }

    inverseJoinColumns = {

    @JoinColumn(name = nomLlaveForanea,

    referencedColumnName = nomColumnaReferenciada),

    ...})modificadorAcceso tiponomReferencia;

    ...}

    En la entidad que no es duea de la relacin tambin se agregarle la anotacin@ManyToManyal atributo que contiene la relacin inversa en la entidad relacionada,slo que en este caso la anotacin tiene la siguiente sintaxis:

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    17/55

    Tema 16 Acceso a Base de Datos Usando JPA 641

    ITSON Manuel Domitsu Kono

    @Ent i t y@Tabl e( name = nomTabl a)publ i c cl ass nomEnt i dad {

    . . .@ManyToMany(mappedBy = nomReferencia)

    modificadorAcceso tiponomReferenciaInversa;

    ...}

    Por ejemplo, el cdigo para las entidades Canci ony Al bumcon la relacin muchos amuchos es la siguiente:

    @Ent i t y@Tabl e( name = canci ones)publ i c cl ass Canci on {

    @I dpr ot ect ed St r i ng cl ave;protected St r i ng t i t ul o;

    prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;pr otect ed Date f echa;

    @ManyToMany@J oi nTabl e(name = canciones_albumes,

    joinColumns = @JoinColumn(name = clave,

    referencedColumnName = clave),

    inverseJoinColumns = @JoinColumn(name = cveAlbum,

    referencedColumnName = cveAlbum))pr otected Li st l i st aAl bumes;

    }

    @Ent i t y@Tabl e( name = al bumes)publ i c cl ass Al bum {

    @I dpr otected St r i ng cveAl bum;pr otected St r i ng nombr e;

    @ManyToMany( mappedBy = l i st aAl bumes)pr otect ed Li st l i st aCanci ones;

    }

    Las tablas corresponientes a las entidades anterios son las siguientes:

    canciones

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat ecveAl bum not nul l , var char ( 10)

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    18/55

    642 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    albumes

    cveAl bum not nul l , pr i mar y key var char ( 10)nombr e not nul l , var char( 20)cl ave not nul l , var char ( 10)

    canciones_albumes

    cl ave not nul l , pr i mar y key var char ( 10)f or ei ng key ( canci ones( cl ave) )

    cveAl bum not nul l , pr i mar y key var char ( 10)f orei ng key ( al bumes( cveAl bum) )

    Anotaciones para la Relacin de Herencia

    @Inheritance

    Esta anotacin se utiliza para especificar el tipo de estrategia que se emplear paramapear la herencia. Se emplea en la entidad padre y su sintaxis es la siguiente:

    @Ent i t y@Tabl e( name = nomTabl a)@Inheritance(strategy = InheritanceType.tipoHerencia)publ i c cl ass nomEntidadPadre {

    . . .}

    Donde tipoHerenciatiene los siguientes valores:

    SINGLE_TABLEpara el caso de la estrategia de una sola tabla JOINEDpara el caso de la estrategia de tablas conjuntas

    TABLE_PER_CLASSpara el caso de la estrategia de una tabla por clase

    @DiscriminatorColumn

    Esta anotacin se utiliza para establecer la columna descriminadora y su tipo en lasestrategias de una sola tabla y de tablas conjuntas. Su sintaxis es:

    @Ent i t y@Tabl e( name = nomTabl a)

    @Inheritance(strategy = InheritanceType.tipoHerencia)@DiscriminatorColumn(name = nomColumnadescriminadora,

    discriminatorType = DiscriminatorType.tipodescriminador,

    length = longitud)publ i c cl ass nomEntidadPadre {

    . . .}

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    19/55

    Tema 16 Acceso a Base de Datos Usando JPA 643

    ITSON Manuel Domitsu Kono

    Donde tipoDescriminadortiene los siguientes valores: STRI NG, CHARo I NTEGER.El valor por ausencia es STRI NG.

    Longitud es la longitud mxima que puede tener el valor del discriminador. Por

    ausencia, su valor es 31.

    @DiscriminatorValue

    Esta anotacin se utiliza para establecer el valor de la columna descriminadora. Estaanotacin se usa en la clase padre si no es abstracta y en las clases hijas Su sintaxis sise usa en la clase padre, es:

    @Ent i t y@Tabl e( name = nomTabl a)@I nher i t ance( st r ategy = I nher i t anceType. tipoHerencia)@Di scr i mi nator Col umn( name = nomCol umnadescr i mi nador a,

    di scr i mi natorType = Di scr i mi natorType. tipodescriminador,

    l ength = longitud)@DiscriminatorValue(value = valor)

    publ i c cl ass nomEntidadPadre {. . .

    }

    O, en caso de las clases hijas:

    @Ent i t y@Tabl e( name = nomTabl a)@DiscriminatorValue(value = valor)

    publ i c cl ass nomEnt i dad ext ends nomEntidadPadre {. . .

    }Donde valortiene que coincidir con el tipo del descriminador. El valor por ausenciaes el nombr e de l a ent i dad.

    @PrimaryKeyJoinColumn

    Esta anotacin se utiliza para establecer el nombre de las llaves forneas en las claseshijas cuando se usa la estrategia de tablas conjuntas. Esas llaves forneas estnrelacionadas con la llave primaria en la tabla asociada a la entidad padre. Su sintaxises:

    @Ent i t y@Tabl e( name = nomTabl a)@Di scr i mi natorVal ue( val ue = val or)@Pr i mar yKeyJ oi nCol umn( name = nomLl aveForanea)publ i c cl ass nomEntidadPadre {

    . . .}

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    20/55

    644 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Ejemplo de Herencia Usando la Estrategia de una Sola Tabla

    @Ent i t y@Tabl e( name = medi os)@I nheri t ance(st r at egy = I nher i t anceType. SI GLED_TABLE)@Di scr i mi nat or Col umn(name = t i poMedi o,

    di scr i mi natorType = Di scr i mi natorType. CHAR)publ i c abst r act cl ass Medi o {

    @I dpr ot ect ed St r i ng cl ave;protected St r i ng t i t ul o;@ManyToOne@J oi nCol umn( name = cveGenero,

    r ef erencedCol umnNane = cveGener o)prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;pr otect ed Date f echa;. . .

    }

    @Ent i t y@Tabl e( name = canci ones)@Di scr i mi natorVal ue( val ue = C )publ i c cl ass Canci on ext ends Medi o {

    pr i vat e St r i ng i nt er pr et e;pr i vat e St r i ng aut or ;pr i vat e d St r i ng al bum;. . .

    }

    @Ent i t y@Tabl e(name = pel i cul as)@Di scr i mi natorVal ue( val ue = P )publ i c cl ass Pel i cul a extends Medi o {

    pr i vat e St r i ng actor1;pr i vat e St r i ng actor2;pr i vat e St r i ng di rect or;. . .

    }

    La tabla en la que se almacenan las entidades anteriores son:

    medios

    cl ave not nul l , pr i mar y key var char ( 10)

    t i t ul o not nul l , varchar( 35)tipoMedio not null, varchar(1)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat ei nt er pr et e var char ( 35)aut or var char ( 35)al bum var char ( 20)act or 1 var char ( 35)

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    21/55

    Tema 16 Acceso a Base de Datos Usando JPA 645

    ITSON Manuel Domitsu Kono

    act or 2 var char ( 35)di r ect or var char ( 35)

    Ejemplo de herencia Usando la Estrategia de Tablas Conjuntas

    @Ent i t y@Tabl e( name = medi os)@I nher i t ance( st r ategy = I nher i t anceType. J OI NED)@Di scr i mi nat or Col umn(name = t i poMedi o,

    di scr i mi natorType = Di scr i mi natorType. CHAR)publ i c abst r act cl ass Medi o {

    @I dpr ot ect ed St r i ng cl ave;protected St r i ng t i t ul o;@ManyToOne@J oi nCol umn( name = cveGenero,

    r ef erencedCol umnNane = cveGener o)prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;

    pr otect ed Date f echa;. . .}

    @Ent i t y@Tabl e( name = canci ones)@Di scr i mi natorVal ue( val ue = C )@Pr i maryKeyJ oi nCol umn( name = cl ave)publ i c cl ass Canci on ext ends Medi o {

    pr i vat e St r i ng i nt er pr et e;pr i vat e St r i ng aut or ;pr i vat e d St r i ng al bum;. . .

    }

    @Ent i t y@Tabl e(name = pel i cul as)@Di scr i mi natorVal ue( val ue = P )@Pr i maryKeyJ oi nCol umn( name = cl ave)publ i c cl ass Pel i cul a extends Medi o {

    pr i vat e St r i ng actor1;pr i vat e St r i ng actor2;pr i vat e St r i ng di rect or;. . .

    }

    Las tablas en la que se almacenan las entidades anteriores son:

    medios

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)tipoMedio not null, varchar(20)

    cveGener o not nul l , var char( 10)f orei ng key ( generos( cveGener o) )

    dur aci on not nul l , i nt eger

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    22/55

    646 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    f echa Dat e

    canciones

    cl ave not nul l , pr i mar y key var char ( 10)f or ei ng key (medi os( cl ave) )

    i nt er pr et e var char ( 35)aut or var char ( 35)al bum var char ( 20)

    peliculas

    cl ave not nul l , pr i mar y key var char ( 10)f or ei ng key (medi os( cl ave) )

    act or 1 var char ( 35)act or 2 var char ( 35)di r ect or var char ( 35)

    Ejemplo de Herencia Usando la Estrategia de una Tabla por Clase

    @Ent i t y@Tabl e( name = medi os)@I nheri t ance(st r at egy = I nher i t anceType. TABLE_PER_CLASS)publ i c abst r act cl ass Medi o {

    @I dpr ot ect ed St r i ng cl ave;protected St r i ng t i t ul o;@ManyToOne@J oi nCol umn( name = cveGenero,

    r ef erencedCol umnNane = cveGener o)prot ect ed Genero gener o;pr ot ect ed i nt dur aci on;pr otect ed Date f echa;. . .

    }

    @Ent i t y@Tabl e( name = canci ones)publ i c cl ass Canci on ext ends Medi o {

    pr i vat e St r i ng i nt er pr et e;pr i vat e St r i ng aut or ;pr i vat e d St r i ng al bum;. . .

    }

    @Ent i t y

    @Tabl e(name = pel i cul as)publ i c cl ass Pel i cul a extends Medi o {

    pr i vat e St r i ng actor1;pr i vat e St r i ng actor2;pr i vat e St r i ng di rect or;. . .

    }

    La tabla en la que se almacenan las entidades anteriores son:

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    23/55

    Tema 16 Acceso a Base de Datos Usando JPA 647

    ITSON Manuel Domitsu Kono

    medios

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat e

    cancionescl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat ei nt er pr et e var char ( 35)aut or var char ( 35)al bum var char ( 20)

    peliculas

    cl ave not nul l , pr i mar y key var char ( 10)t i t ul o not nul l , varchar( 35)cveGener o not nul l , var char( 10)

    f orei ng key ( generos( cveGener o) )dur aci on not nul l , i nt egerf echa Dat eact or 1 var char ( 35)act or 2 var char ( 35)di r ect or var char ( 35)

    Ejemplo sobre Mapeo Objeto Relacional

    Como un ejemplo sobre mapeo Objeto Relacional considere el conjunto de entidadescuyo diagrama de clases se muestra en la figura 16.1 y que va a ser persistido en labase de datos musicaJPA cuyo diagrama Entidad relacin se muestra en la figura16.2.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    24/55

    648 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Figura 16.1

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    25/55

    Tema 16 Acceso a Base de Datos Usando JPA 649

    ITSON Manuel Domitsu Kono

    Figura 16.2

    El siguiente cdigo parcial de la entidad Genero, muestra las anotaciones de la entidady sus atributos. No se muestran los mrodos de acceso get Xxx( ) , setXxx( ) ,equal s( ) ni hashCode( ) :

    Genero.java/ ** Gener o. j ava.* @aut hor mdomi t su

    */package obj etosNegoci o;

    i mport j ava. i o. Seri al i zabl e;i mpor t j avax. per si st ence. Basi c;i mport j avax. per si st ence. Col umn;i mpor t j avax. per si st ence. Ent i t y;i mpor t j avax. per si st ence. I d;i mport j avax. per si st ence. NamedQuer i es;i mport j avax. pers i st ence. NamedQuery;i mpor t j avax. per si st ence. Tabl e;

    @Ent i t y@Tabl e( name = "generos" )

    @NamedQuer i es( {@NamedQuer y( name = "Genero. f i ndAl l " , query = "SELECT g FROM Genero g") ,@NamedQuery( name = "Genero. f i ndByCveGenero" ,

    query = "SELECT g FROM Gener o g WHERE g. cveGener o = : cveGener o") ,@NamedQuer y( name = "Gener o. f i ndByNombr e" ,

    query = "SELECT g FROM Genero g WHERE g. nombr e = : nombr e") ,@NamedQuery( name = "Gener o. f i ndByTi poMedi o" ,

    query = "SELECT g FROM Genero g WHERE g. t i poMedi o = : t i poMedi o") })

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    26/55

    650 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    publ i c cl ass Genero i mpl ement s Ser i al i zabl e {pr i vat e st at i c f i nal l ong ser i al Ver si onUI D = 1L;

    @I d@Basi c( opt i onal = f al se)@Col umn( name = "cveGener o" )pr i vat e St r i ng cveGener o;

    @Basi c( opt i onal = f al se)@Col umn( name = "nombr e" )pr i vat e St r i ng nombr e;

    @Basi c( opt i onal = f al se)@Col umn( name = " t i poMedi o")pr i vat e char t i poMedi o;

    publ i c Gener o( ) {}

    publ i c Genero( St r i ng cveGenero) {t hi s. cveGenero = cveGenero;}

    publ i c Gener o(St r i ng cveGener o, St r i ng nombr e, char t i poMedi o) {t hi s. cveGenero = cveGenero;t hi s. nombre = nombre;t hi s. t i poMedi o = t i poMedi o;

    }

    . . .

    @Over r i depubl i c St r i ng t oSt r i ng( ) {

    r eturn cveGenero + " , " + nombre + " , " + t i poMedi o;}

    }

    El siguiente cdigo parcial de la entidad Medi o, muestra las anotaciones de la entidady sus atributos. No se muestran los mrodos de acceso get Xxx( ) , setXxx( ) ,equal s( ) ni hashCode( ) :

    Medio.java/ ** Medi o. j ava.

    * @aut hor mdomi t su*/package obj etosNegoci o;

    i mport j ava. i o. Seri al i zabl e;i mpor t j avax. per si st ence. Basi c;i mport j avax. per si st ence. Col umn;i mpor t j avax. per si st ence. Di scr i mi nat or Col umn;i mpor t j avax. per si st ence. Di scr i mi nat or Type;i mpor t j avax. per si st ence. Ent i t y;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    27/55

    Tema 16 Acceso a Base de Datos Usando JPA 651

    ITSON Manuel Domitsu Kono

    i mpor t j avax. per si st ence. I d;i mpor t j avax. per si st ence. I nher i t ance;i mpor t j avax. per si st ence. I nher i t anceType;i mpor t j avax. per si st ence. J oi nCol umn;i mport j avax. pers i st ence. ManyToOne;i mport j avax. per si st ence. NamedQuer i es;i mport j avax. pers i st ence. NamedQuery;i mpor t j avax. per si st ence. Tabl e;

    @Ent i t y@Tabl e( name = "medi os" )@I nher i t ance( st r ategy = I nher i t anceType. J OI NED)@Di scr i mi nat orCol umn(name = " t i poMedi o", di scr i mi nat orType =Di scr i mi natorType. CHAR)

    @NamedQuer i es( {@NamedQuer y( name = "Medi o. f i ndAl l " , query = "SELECT m FROM Medi o m") ,@NamedQuery( name = "Medi o. f i ndByCl ave",

    query = "SELECT m FROM Medi o m WHERE m. cl ave = : cl ave" ) ,@NamedQuer y( name = "Medi o. f i ndByTi t ul o",

    query = "SELECT mFROM Medi o mWHERE m. t i t ul o = : t i t ul o") ,@NamedQuery( name = "Medi o. f i ndByDuraci on",query = "SELECT m FROM Medi o m WHERE m. dur aci on = : dur aci on") })

    publ i c abst r act cl ass Medi o i mpl ement s Ser i al i zabl e {pr i vat e st at i c f i nal l ong ser i al Ver si onUI D = 1L;

    @I d@Basi c( opt i onal = f al se)@Col umn( name = "cl ave")pr ot ect ed St r i ng cl ave;

    @Basi c( opt i onal = f al se)@Col umn( name = " t i t ul o")protected St r i ng t i t ul o;

    @Col umn( name = "duraci on")pr otected I nt eger dur aci on;

    @ManyToOne( opt i onal = f al se)@J oi nCol umn( name = "cveGener o", r ef er encedCol umnName = "cveGener o")prot ect ed Genero gener o;

    publ i c Medi o( ) {}

    publ i c Medi o( St r i ng cl ave) {

    t hi s. cl ave = cl ave;}

    publ i c Medi o( St r i ng cl ave, St r i ng t i t ul o, i nt dur aci on, Gener o gener o) {t hi s. cl ave = cl ave;thi s . t i tul o = t i tul o;t hi s. dur aci on = dur aci on;t hi s. genero = gener o;

    }

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    28/55

    652 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    . . .

    @Over r i depubl i c St r i ng t oSt r i ng( ) {

    r et ur n cl ave + " , " + t i t ul o + " , " + gener o. getNombr e( ) ;}

    }

    El siguiente cdigo parcial de la entidad Canci on, muestra las anotaciones de laentidad y sus atributos. No se muestran los mrodos de acceso get Xxx( ) nisetXxx( ) :

    Cancion.java/ ** Canci on.* @aut hor mdomi t su*/

    package obj etosNegoci o;i mport j ava. i o. Seri al i zabl e;i mpor t j ava. ut i l . Li s t ;i mport j avax. per si st ence. Col umn;i mpor t j avax. per si st ence. Di scri mi nat or Val ue;i mpor t j avax. per si st ence. Ent i t y;i mpor t j avax. per si st ence. J oi nCol umn;i mpor t j avax. per si st ence. J oi nTabl e;i mport j avax. pers i st ence. ManyToMany;i mport j avax. per si st ence. NamedQuer i es;i mport j avax. pers i st ence. NamedQuery;i mport j avax. per si st ence. Pri maryKeyJ oi nCol umn;i mpor t j avax. per si st ence. Tabl e;

    @Ent i t y@Tabl e( name = "canci ones" )@Di scr i mi nat orVal ue(val ue = "C" )@Pr i mar yKeyJ oi nCol umn( name = "cl ave" )

    @NamedQuer i es( {@NamedQuer y( name = "Canci on. f i ndAl l " , query = "SELECT c FROM Canci on c" ) ,@NamedQuery( name = "Canci on. f i ndByCl ave",

    query = "SELECT c FROM Canci on c WHERE c. cl ave = : cl ave") ,@NamedQuer y( name = "Canci on. f i ndByI nt erpret e",

    query = "SELECT c FROM Canci on c WHERE c. i nt erpr ete = : i nt erpr ete") ,@NamedQuery( name = "Canci on. f i ndByAut or " ,

    query = "SELECT c FROM Canci on c WHERE c. aut or = : aut or " ) })

    publ i c cl ass Canci on ext ends Medi o i mpl ement s Ser i al i zabl e {pr i vat e st at i c f i nal l ong ser i al Ver si onUI D = 1L;

    @Col umn( name = " i nt erpret e")pr i vat e St r i ng i nt er pr et e;

    @Col umn( name = "aut or " )pr i vat e St r i ng aut or ;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    29/55

    Tema 16 Acceso a Base de Datos Usando JPA 653

    ITSON Manuel Domitsu Kono

    @ManyToMany@J oi nTabl e(name = "canci ones_al bums" ,

    j oi nCol umns = {@J oi nCol umn( name = " cl ave",r ef erencedCol umnName = "cl ave") },

    i nver seJ oi nCol umns = {@J oi nCol umn(name = "cveAl bum",r ef er encedCol umnName = "cveAl bum") })

    pr i vat e Li st l i st aAl bums;

    publ i c Canci on( ) {}

    publ i c Canci on( St r i ng cl ave) {super ( cl ave) ;

    }

    publ i c Canci on( St r i ng cl ave, St r i ng t i t ul o, i nt dur aci on, Gener o gener o,St r i ng i nt er pr et e, St r i ng aut or ) {

    super ( cl ave, t i t ul o, dur aci on, gener o) ;t hi s. i nt er pr et e = i nt er pr et e;

    t hi s. aut or = aut or ;}

    . . .

    publ i c voi d agr egaAl bum( Al bum al bum) {i f ( l i st aAl bums == nul l ) {

    l i st aAl bums = new Ar r ayLi st ( ) ;}l i st aAl bums. add( al bum) ;

    }

    publ i c voi d el i mi naAl bum( Al bum al bum) {l i st aAl bums. r emove( al bum) ;

    }

    @Over r i depubl i c St r i ng t oSt r i ng( ) {

    return super. t oSt r i ng( ) ;}

    }

    El siguiente cdigo parcial de la entidad Pel i cul a, muestra las anotaciones de laentidad y sus atributos. No se muestran los mrodos de acceso get Xxx( ) nisetXxx( ) :

    Pelicula.java/ ** Pel i cul a. j ava.* @aut hor mdomi t su*/

    package obj etosNegoci o;

    i mport j ava. i o. Seri al i zabl e;i mport j ava. ut i l . Dat e;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    30/55

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    31/55

    Tema 16 Acceso a Base de Datos Usando JPA 655

    ITSON Manuel Domitsu Kono

    St r i ng di r ect or , Dat e f echa) {super ( cl ave, t i t ul o, dur aci on, gener o) ;t hi s. di rect or = di r ector;t hi s. f echa = f echa;

    }

    . . .

    publ i c voi d agr egaAct or ( Act or act or ) {i f ( l i st aActores == nul l ) {

    l i st aAct ores = new Ar r ayLi st ( ) ;}l i staActores. add( actor) ;

    }

    publ i c voi d el i mi naAct or ( Act or act or ) {l i st aAct or es. r emove( act or ) ;

    }

    @Over r i de

    publ i c St r i ng t oSt r i ng( ) {r et ur n super . t oSt r i ng( ) + ", " + di r ector;}

    }

    El siguiente cdigo parcial de la entidad Al bum, muestra las anotaciones de la entidady sus atributos. No se muestran los mrodos de acceso get Xxx( ) , setXxx( ) ,equal s( ) ni hashCode( ) :

    Album.java/ ** Al bum. j ava.

    * @aut hor mdomi t su*/

    package obj etosNegoci o;

    i mport j ava. i o. Seri al i zabl e;i mport j ava. ut i l . Dat e;i mpor t j ava. ut i l . Li s t ;i mpor t j avax. per si st ence. Basi c;i mport j avax. per si st ence. Col umn;i mpor t j avax. per si st ence. Ent i t y;i mpor t j avax. per si st ence. I d;i mport j avax. pers i st ence. ManyToMany;i mport j avax. per si st ence. NamedQuer i es;

    i mport j avax. pers i st ence. NamedQuery;i mpor t j avax. per si st ence. Tabl e;i mpor t j avax. per si st ence. Tempor al ;i mport j avax. per si st ence. Temporal Type;

    @Ent i t y@Tabl e( name = "al bums" )

    @NamedQuer i es( {@NamedQuer y( name = "Al bum. f i ndAl l " , query = "SELECT a FROM Al bum a") ,

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    32/55

    656 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    @NamedQuer y( name = "Al bum. f i ndByCveAl bum",query = "SELECT a FROM Al bum a WHERE a. cveAl bum = : cveAl bum") ,

    @NamedQuery( name = "Al bum. f i ndByTi t ul o",quer y = "SELECT a FROM Al bum a WHERE a. t i t ul o = : t i t ul o") ,

    @NamedQuery( name = "Al bum. f i ndByDi squera" ,query = "SELECT a FROM Al bum a WHERE a. di squera = : di squera") ,

    @NamedQuery( name = "Al bum. f i ndByFecha",query = "SELECT a FROM Al bum a WHERE a. f echa = : f echa" ) })

    publ i c cl ass Al bum i mpl ement s Ser i al i zabl e {pr i vat e st at i c f i nal l ong ser i al Ver si onUI D = 1L;

    @I d@Basi c( opt i onal = f al se)@Col umn( name = "cveAl bum")pr i vat e St r i ng cveAl bum;

    @Basi c( opt i onal = f al se)@Col umn( name = " t i t ul o")pr i vat e St r i ng t i t ul o;

    @Col umn( name = "di squera")pr i vat e St r i ng di squer a;

    @Col umn( name = " f echa")@Temporal ( Temporal Type. DATE)pr i vat e Dat e f echa;

    @ManyToMany( mappedBy = " l i st aAl bums")pr i vat e Li st l i st aCanci ones;

    publ i c Al bum( ) {}

    publ i c Al bum( St r i ng cveAl bum) {t hi s. cveAl bum = cveAl bum;

    }

    publ i c Al bum( St r i ng cveAl bum, St r i ng t i t ul o, St r i ng di squer a,Dat e f echa) {

    t hi s. cveAl bum = cveAl bum;thi s . t i tul o = t i tul o;t hi s. di squer a = di squer a;t hi s. f echa = f echa;

    }

    . . .

    publ i c voi d agr egaCanci on( Canci on canci on) {i f ( l i st aCanci ones == nul l ) {

    l i st aCanci ones = new Ar r ayLi st ( ) ;}l i st aCanci ones. add( canci on) ;

    }

    publ i c voi d el i mi naCanci on( Canci on canci on) {l i st aCanci ones. r emove( canci on) ;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    33/55

    Tema 16 Acceso a Base de Datos Usando JPA 657

    ITSON Manuel Domitsu Kono

    }

    @Over r i depubl i c St r i ng t oSt r i ng( ) {

    r et ur n cveAl bum + ", " + t i t ul o;}

    }

    El siguiente cdigo parcial de la entidad Act or , muestra las anotaciones de la entidady sus atributos. No se muestran los mrodos de acceso get Xxx( ) , setXxx( ) ,equal s( ) ni hashCode( ) :

    Actor.java/ ** Actor. j ava* @aut hor mdomi t su*/

    package obj etosNegoci o;

    i mport j ava. i o. Seri al i zabl e;i mpor t j ava. ut i l . Li s t ;i mpor t j avax. per si st ence. Basi c;i mport j avax. per si st ence. Col umn;i mpor t j avax. per si st ence. Ent i t y;i mpor t j avax. per si st ence. I d;i mport j avax. pers i st ence. ManyToMany;i mport j avax. per si st ence. NamedQuer i es;i mport j avax. pers i st ence. NamedQuery;i mpor t j avax. per si st ence. Tabl e;

    @Ent i t y@Tabl e( name = "act ores" )

    @NamedQuer i es( {@NamedQuer y( name = "Act or . f i ndAl l " , query = "SELECT a FROM Act or a") ,@NamedQuery( name = "Act or . f i ndByCveAct or " ,

    query = "SELECT a FROM Act or a WHERE a. cveAct or = : cveAct or " ) ,@NamedQuery( name = "Act or . f i ndByNombr e",

    query = "SELECT a FROM Act or a WHERE a. nombr e = : nombr e") })

    publ i c cl ass Act or i mpl ement s Ser i al i zabl e {pr i vat e st at i c f i nal l ong ser i al Ver si onUI D = 1L;

    @I d@Basi c( opt i onal = f al se)

    @Col umn( name = "cveAct or " )pr i vat e St r i ng cveAct or ;

    @Basi c( opt i onal = f al se)@Col umn( name = "nombr e" )pr i vat e St r i ng nombr e;

    @ManyToMany(mappedBy = " l i st aAct or es" )pr i vat e Li st l i staPel i cul as;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    34/55

    658 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    publ i c Actor( ) {}

    publ i c Act or ( St r i ng cveAct or ) {t hi s. cveAct or = cveAct or;

    }

    publ i c Act or ( St r i ng cveAct or, St r i ng nombr e) {t hi s. cveAct or = cveAct or;t hi s. nombre = nombre;

    }

    . . .

    publ i c voi d agr egaPel i cul a( Pel i cul a pel i cul a) {i f ( l i s taPel i cul as == nul l ) {

    l i st aPel i cul as = new Ar r ayLi st ( ) ;}l i s taPel i cul as. add( pel i cul a) ;

    }

    publ i c voi d el i mi naPel i cul a( Pel i cul a pel i cul a) {l i staPel i cul as. remove( pel i cul a) ;

    }

    @Over r i depubl i c St r i ng t oSt r i ng( ) {

    r eturn cveAct or + " , " + nombre;}

    }

    Interface used to interact with the persistence context.

    An Ent i t yManager instance is associated with a persistence context. A persistence context is a

    set of entity instances in which for any persistent entity identity there is a unique entity instance.

    Within the persistence context, the entity instances and their lifecycle are managed. TheEnt i t yManager API is used to create and remove persistent entity instances, to find entities by

    their primary key, and to query over entities.

    The set of entities that can be managed by a given Ent i t yManager instance is defined by a

    persistence unit. A persistence unit defines the set of all classes that are related or grouped by the

    application, and which must be colocated in their mapping to a single database.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    35/55

    Tema 16 Acceso a Base de Datos Usando JPA 659

    ITSON Manuel Domitsu Kono

    El Administrador de Entidades

    ElAdministrador de Ent idadesde la JPA es la componente de software, la API deJPA, que persiste las entidades en una base de datos. Para ello el administrador de

    entidades utiliza la metainformacin provista por las anotaciones que tiene una entidad.

    Figura 16.3

    Las clases e interfaces principales de la API de JPA se muestran en el diagrama de

    clases de la figura 16.3. Esa API est implementada por el administrador de entidadesy en su mayor parte est encapsulada por la interfaz Ent i t yManager .

    Un proveedor de persistencia (por ejemplo Hibernateo Toplink) implementa la

    mquina que repalda a toda la API de persistencia, desde el Ent i t yManager , elQueryy la generacin de SQL.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    36/55

    660 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Figura 16.4

    Para que una aplicacin pueda persistir una o ms entidades, se requiere crear uno oms administradores de entidad. Todos los administradores de entidades son creados

    invocando al mtodo cr eat eEnt i t yManager ( ) de una instancia deEnt i t yManager Fact ory, que es una fbrica de entidades. La configuracinadministrador de entidades

    Clase Persistencia

    Esta clase nos permite crear una fbrica de administradores de entidad en ambientesde ejecucin en los que no se tiene un contenedor de java EE, como es el caso de unaaplicacin de escritorio.

    Tabla 16.1 Clase Persistancepubl i c stat i c Ent i t yManager Fact or y createEntityManagerFactory(

    St r i ngpersistenceUnitName)

    Crea y regresa una fbrica de administradores de entidad para la unidad de persistencia del parmetro.

    Parmetros:persistenceUnitName: Nombre de la unidad de persistencia.

    Regresa:La fbrica que crea administradores de entidad configurados de acuerdo a la unidad depersistencia dada.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    37/55

    Tema 16 Acceso a Base de Datos Usando JPA 661

    ITSON Manuel Domitsu Kono

    Interfaz EntityManagerFactory

    Esta interfaz nos permite interactuar con la fbrica de administradores de entidad parala unidad de persistencia.

    Una vez que la aplicacin termina de usar la fbrica de administradores de entidad, laaplicacin debe cerrarla. Cuando se cierra la fbrica, todos sus administradores deentidades estn en el estado cerrado. Los mtodos de esta interfaz estn en la tabla16.2.

    Tabla 16.2 Interfaz EntityManagerFactoryEnt i t yManager createEntityManager( )

    Este mtodo crea un administrador de entidades administrado por la aplicacin.

    Regresa:Una instancia de un administrador de persistencia.

    Lanza:

    I l l egal St at eExcept i on- Si la fbrica de administradores de entidad se ha cerrado.voi d close( )

    Cierra la fbrica de administradores de entidad liberando los recursos ocupados. Cuando se cierra lafbrica, todos sus administradores de entidades estn en el estado cerrado.

    Lanza:

    I l l egal St at eExcept i on- Si la fbrica de administradores de entidad se ha cerrado.bool ean isOpen( )

    Regresa verdadera hasta que la fbrica de administradores de entidad se cierre.

    Regresa:Verdadero si la fbrica est abierta, falso en caso contrario.

    Interfaz EntityManager

    Esta interfaz nos permite interactuar con el contexto de persistencia. Los mtodos deesta interfaz, a excepcin de los que nos permiten crear consultas, estn en la tabla16.3.

    Tabla 16.3 Interfaz Enti tyManager

    voi dpersist( Obj ect entity)

    Hace que una instancia de una entidad se vuelva administrada y persistente.

    Parmetros:entity: Instancia de una entidad a volverse administrada y persistente..

    Lanza:

    Ent i t yExi st sExcept i on Si la entidad ya existe.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    38/55

    662 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    I l l egal Ar gument Except i on Si el parmetro no es una entidad. Tmerge( T entity)

    Combina el estado de la entidad del parmetro con el contexto de persistencia actual.

    Parmetros:

    entity: Instancia de una entidad a combinar con el contexto de persistencia actual.

    Regresa:La instancia administrada a la que se le combin el estado de la entidad del parmeto.

    Lanza:

    I l l egal Ar gument Except i on Si el parmetro no es una entidad o ya ha sido eliminada.voi d remove( Obj ect ent i t y)

    Elimina la entidad del parmetro.

    Parmetros:entity: Instancia de una entidad a eliminarse.

    Lanza:

    I l l egal Ar gument Except i on Si el parmetro no es una entidad o ya no se encuentraadministrada.

    T find( Cl ass ent i t yCl ass, Obj ect pr i maryKey)

    Encuentra y regresa una entidad de la clase y llave primaria dados por sus parmetros. Si la instanciade la entidad est en el contexto de persistencia, se regresa de all.

    Parmetros:entityClass: Clase a la que pertenece la Instancia.

    primaryKey: Valor de la llave primaria.

    Regresa:La instancia de la entidad hallada o null si la entidad no existe.

    Lanza:

    I l l egal Ar gument Except i on Si el primer argumento no denota un tipo de entidad o si elsegundo argumento no es un tipo vlido para la llave primaria de la entidad o es null.

    T getReference( Cl ass ent i t yCl ass, Obj ect pr i maryKey)

    Obtiene una instancia cuyo estado puede obtenerse de modo lazy. La aplicacin no puede suponerque el estado de la instancia se encuentre no administrada a menos que haya sido accesado por laaplicacin mientras el administrador de entidades estuvo abierto.

    Parmetros:

    entityClass: Clase a la que pertenece la Instancia.primaryKey: Valor de la llave primaria.

    Regresa:La instancia de la entidad hallada.

    Lanza:

    I l l egal Ar gument Except i on Si el primer argumento no denota un tipo de entidad o si elsegundo argumento no es un tipo vlido para la llave primaria de la entidad o es null.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    39/55

    Tema 16 Acceso a Base de Datos Usando JPA 663

    ITSON Manuel Domitsu Kono

    Ent i t yNotFoundExcept i on Si el estado de la entidad no puede accederse.voi d flush( )

    Sincroniza el contexto de persistencia con su base de datos relacionado.

    Lanza:

    Tr ansact i onRequi r edExcept i on Si no hay una transaccin.Per si st enceExcept i on Si el sincronizado falla.

    voi d refresh( Obj ect ent i t y)

    Refresca el estado de una instancia de una base de datos, sobreescribiendo los cambios hechos a laentidad, si los hay.

    Parmetros:entity: Instancia de la entidad.

    Lanza:

    I l l egal Ar gument Except i on Si la instancia no es una entidad o la entidad no estadministrada.

    Ent i t yNotFoundExcept i on Si la entidad no existe en la base de datos.voi d clear( )

    Limpia todo el context de la persistencia, hacienda que las entidades administradas se conviertan a noaministradas. Los cambios hechos a las entidades y que no se hayan vaciado a la base de datos nosern persistidos.voi d detach( Obj ect entity)

    Elimina la entidad dada por el parmetro del contexto de persistencia, haciendo que la entidadadministrada se convierta a no administrada. Los cambios hechos a las entidades y que no se hayanvaciado a la base de datos no sern persistidos.

    Parmetros:

    entity: Instancia de la entidad.

    Lanza:

    I l l egal Ar gument Except i on Si la instancia no es una entidad.bool ean contains( Obj ect ent i t y)

    Verifica si la instancia es una instancia de una entidad administrada que pertenece al contexto depersistencia actual.

    Parmetros:entity: Instancia de la entidad.

    Regresa:

    Verdadero si la instancia de la entidad est en el contexto de la persistencia.

    Lanza:

    I l l egal Ar gument Except i on Si la instancia no es una entidad.voi d close( )

    Cierra el administrador de persistencia, Despus de invocar al mtodo close() todos los mtodos del

    administrador de las entidades lanzarn una excepcin del tipo I l l egal St at eExcept i on.bool ean isOpen( )

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    40/55

    664 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Determina si el administrador de entidades est abierto.

    Regresa:Verdadero hasta que el administrador de entidades se cierre.

    Ent i t yTr ansact i on getTransaction( )

    Regresa un objeto del tipo Ent i t yTr ansact i on. La instancia de Ent i t yTr ansact i onse puedeusar para iniciar y comprometer transacciones mltiples.

    Regresa:Una instancia de Ent i t yTr ansact i on.

    Interfaz EntityTransaction

    Esta interfaz nos permite controlar las transacciones en administradores de entidad conrecursos locales. Los mtodos de esta interfaz estn en la tabla 16.4.

    Tabla 16.4 Interfaz EntityTransactionvoi dbegin( )

    Inicia la transaccin de un recurso.

    Lanza:

    I l l egal St at eExcept i on- Si i sActi ve( ) regresa verdadero.voi d commit( )

    Compromete (termina) la transaccin del recurso actual, escribiendo los cambios que no se hayanhecho a la base de datos.

    Lanza:

    I l l egal St at eExcept i on- Si i sAct i ve( ) regresa falso.

    Rol l BackExcept i on Si la operacin no puede comprometerse.voi d rollback( )

    Regresa al estado original la transaccin del recurso actual.

    Lanza:

    I l l egal St at eExcept i on- Si i sAct i ve( ) regresa falso.Per si st enceExcept i on Si ocurre una condicin de error inesperada.

    i sAct i ve( )

    Indica si una transaccin de un recurso se encuentra en proceso.

    Regresa:Verdadero si una transaccin de un recurso se encuentra en proceso, falso en caso contrario.

    Lanza:Per si st enceExcept i on Si ocurre una condicin de error inesperada.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    41/55

    Tema 16 Acceso a Base de Datos Usando JPA 665

    ITSON Manuel Domitsu Kono

    La API de Consultas de JPA

    La API de Consultas de JPA nos permite escribir consultas para obtener una entidadsimple o una coleccin de entidades. Esas consultas pueden escribirse usando el

    Lenguaje de Consultas de la Persistencia de Java, JPQL o el lenguaje SQL. Al usarJPQL obtenemos como resultado un objeto o una coleccin de objetos, mientras que siusamos el lenguaje SQL los resutados de la consulta son registros de la BD que debenser convertidos a objetos.

    La API de Consultas de JPA est formada por:

    Los mtodos de la interfaz Ent i t yManager que nos permiten crear consultas.

    Los mtodos de la interfaz Queryque nos permiten definir y ejecutar lasconsultas.

    El lenguaje JPQL

    La API de Consultas nos permite crear dos tipos de consultas: Consultas con Nombreo Estticasy Consultas Dinmicas. Las consultas con nombre son para almacenarsey reutilizarse. Son consultas que se van a realizarse desde varios mdulos de laaplicacin y no queremos que se construya la consulta cada vez que se haga. Susventajas son:

    Mejoran la reutilizacin de las consultas.

    Mejoran la mantenibilidad del cdigo, las consultas se pueden concentrar enciertas partes del cdigo en lugar de estar dispersas en todo el cdigo de lalgica del negocio.

    Aumentan el desempeo ya que se preparan una sla vez y pueden reusarseeficientemente.

    Por otro lado, las consultas dinmicas se emplean cuando la consulta depende de lasentradas del usuario o alguna condicin en la lgica de la aplicacin. Tanto lasconsultas con nombre como las consultas dinmicas pueden escribirse usando ellenguaje JPQL o el lenguaje SQL. A las consultas escritas en el lenguaje SQL se lesllama consultas nativas.

    Antes de crear y ejecutar una consulta con nombre debemos definirla. En el caso deuna consulta dinmica la definicin se hace en el momento de crearla.

    Definicin de Consultas con Nombre

    Para definir una consulta con nombre se usa la anotacin @NamedQuer yen unaentidad. Su sintaxis es:

    @Ent i t y@Tabl e( name = nombreTabl a)@NamedQuery(name = nombreConsulta, query = consulta)

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    42/55

    666 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Publ i c cl ass NomEnt i dad i mpl ement s Ser i al i zabl e {. . .

    }

    Por ejemplo, para la entidad Generopodemos definir la siguiente consulta con nombre:

    @Ent i t y@Tabl e( name = "generos" )@NamedQuery( name = "Gener o. f i ndAl l " , query = "SELECT g FROM Gener o g")publ i c cl ass Gener o i mpl ement s Ser i al i zabl e {

    pr i vat e st at i c f i nal l ong ser i al Ver si onUI D = 1L;

    @I d@Basi c( opt i onal = f al se)@Col umn( name = "cveGener o" )pr i vat e St r i ng cveGener o;

    @Basi c( opt i onal = f al se)@Col umn( name = "nombr e" )

    pr i vat e St r i ng nombr e;

    @Basi c( opt i onal = f al se)@Col umn( name = " t i poMedi o")pr i vat e char t i poMedi o;

    . . .}

    Podemos agrupar varias definiciones usando la anotacin @NamedQuer i es en unaentidad. Su sintaxis es:

    @Ent i t y

    @NamedQueries({@NamedQuery( name = nombreConsul t a1, quer y = consul t a1) [ ,@NamedQuer y( name = nombreConsul t a2, query = consul t a2) ] . . .

    })

    @Tabl e( name = nombreTabl a)

    Publ i c cl ass NomEnt i dad i mpl ement s Ser i al i zabl e {. . .

    }

    Por ejemplo, para la entidad Generopodemos definir las siguientes consultas connombre:

    @Ent i t y@Tabl e( name = "generos" )@NamedQuer i es( {

    @NamedQuery( name = "Gener o. f i ndAl l " ,query = "SELECT g FROM Genero g") ,

    @NamedQuery( name = "Genero. f i ndByCveGenero" ,query = "SELECT g FROM Genero gWHERE g. cveGener o = : cveGener o") ,

    @NamedQuer y( name = "Gener o. f i ndByNombr e" ,

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    43/55

    Tema 16 Acceso a Base de Datos Usando JPA 667

    ITSON Manuel Domitsu Kono

    query = "SELECT g FROM Genero gWHERE g. nombre = : nombre") ,

    @NamedQuery( name = "Gener o. f i ndByTi poMedi o" ,query = "SELECT g FROM Genero gWHERE g. t i poMedi o = : t i poMedi o") })

    publ i c cl ass Gener o i mpl ement s Ser i al i zabl e {pr i vat e st at i c f i nal l ong ser i al Ver si onUI D = 1L;

    @I d@Basi c( opt i onal = f al se)@Col umn( name = "cveGener o" )pr i vat e St r i ng cveGener o;

    @Basi c( opt i onal = f al se)@Col umn( name = "nombr e" )pr i vat e St r i ng nombr e;

    @Basi c( opt i onal = f al se)@Col umn( name = " t i poMedi o")pr i vat e char t i poMedi o;

    . . .}

    Las consultas con nombre tienen mbito de unidad de persistencia y por lo tanto tienennombres nicos.

    Creacin de Consultas

    La interfaz Ent i t yManager contiene varios mtodos que nos permiten crear consultastanto con nombre o dinmicas. Estas ltimas pueden usar el lenguaje JPQL o el

    lenguaje SQL. Los mtodos de la interfaz Ent i t yManager que nos permiten crearconsultas se muestran en la tabla 16.5:

    Tabla 16.5 Interfaz Enti tyManagerQuery createNamedQuery( St r i ng name)

    Crea una consulta con nombre en el lenguaje de consultas de la persistencia de Java, JPQL o en elSQL nativo.

    Parmetros:name: El nombre de la consulta definido en metadata.

    Regresa:La consulta con nombre creada. Una instancia del tipo Query.

    Lanza:

    I l l egal Ar gument Except i on Si la cadena de consulta en JPQL mo es vlida. O no hayuna consulta con ese nombre.

    Query createQuery( St r i ng qlString)

    Crea una consulta dinmica en el lenguaje de consultas de la persistencia de Java, JPQL.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    44/55

    668 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Parmetros:qlString: Una cadena de consulta en JPQL.

    Regresa:La consulta dinmica creada. Una instancia del tipo Query.

    Lanza:

    I l l egal Ar gument Except i on Si la cadena de consulta en JPQL no es vlida.Query createNativeQuery( St r i ng sqlString)

    Crea una consulta dinmica en el lenguaje SQL para actualizar o borrar.

    Parmetros:sqlString: Una cadena de consulta en SQL nativo.

    Regresa:La consulta creada. Una instancia del tipo Query.

    Query createNativeQuery( St r i ng sql St r i ng, Cl ass resul t Cl ass)

    Crea una consulta dinmica en el lenguaje SQLque obtiene una entidad simple.

    Parmetros:sqlString: Una cadena de consulta en SQL nativo.

    r esul t Cl ass: La clase de la(s) instancia(s) resultante(s).

    Regresa:La consulta creada. Una instancia del tipo Query.

    Query createNativeQuery( St r i ng sql St r i ng, St r i ng r esul t - set Mappi ng)

    Crea una instancia de Quer ypara ejecutar una consulta SQL nativo.

    Parmetros:sqlString: Una cadena de consulta en SQL nativo.

    r esul t - set Mappi ng: El nombre del mapeo del resultado.

    Regresa:La consulta creada. Una instancia del tipo Query.

    Para crear una consulta debemos tener un manejador de entidad abierto. Por ejemplo,el siguiente cdigo nos crea una consulta con nombre para obtener todos los gnerosde la BD.

    publ i c Li st f i ndAl l Gener oEnt i t i es( ) {

    / / Cr ea un admi ni st r ador de ent i dadesEnt i t yManager em = getEnt i t yManager( ) ;

    try {/ / Genera l a consul t a con nombr eQuery q = em.createNamedQuery("Genero.findAll");

    retur n q. get Resul t Li st( ) ;} f i nal l y {

    em. cl ose( ) ;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    45/55

    Tema 16 Acceso a Base de Datos Usando JPA 669

    ITSON Manuel Domitsu Kono

    }

    El siguiente cdigo nos crea una consulta dinmica para obtener todos los gneros dela BD.

    publ i c Li st f i ndAl l Gener oEnt i t i es2( ) {

    / / Cr ea un admi ni st r ador de ent i dadesEnt i t yManager em = getEnt i t yManager( ) ;

    try {/ / Gener a l a consul t a di nami caQuery q = em.createQuery("select g from Genero g");

    retur n q. get Resul t Li st( ) ;} f i nal l y {

    em. cl ose( ) ;}

    Por ltimo, el siguiente cdigo nos crea una consulta dinmica nativa para obtener

    todos los gneros de la BD.

    publ i c Li st f i ndAl l Gener oEnt i t i es2( ) {/ / Cr ea un admi ni st r ador de ent i dadesEnt i t yManager em = getEnt i t yManager( ) ;

    try {/ / Gener a l a consul t a di nami caQuery q = createNativeQuery("select * from generos",

    Genero.class);

    retur n q. get Resul t Li st( ) ;} f i nal l y {

    em. cl ose( ) ;}

    Ejecucin de Consultas

    La interfaz Quer ynos permite controlar la ejecucin de las consultas. Los mtodos deesta interfaz pueden usarse tanto con las consultas con nombre, las consultasdinmicas y las consultas dinmicas nativas. Los mtodos de esta interfaz estn en latabla 16.6.

    Tabla 16.6 Interfaz QueryLi st getResultList( )

    Este mtodo ejecuta una consulta SELECT y regresa los resultados en una lista sin tipo.

    Regresa:Una lista de los resultados.

    Lanza:

    I l l egal St at eExcept i on- Si se le llama con una sentencia UPDATE o DELETE en el

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    46/55

    670 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    lenguaje de consultas de la persistencia de Java, JPQL.

    Quer yTi meOut Except i on Si la ejecucin de la consulta excede el tiempo establecido(timeout) y slo la sentencia se regresa a su estado original.Per si st enceExcept i on Si la ejecucin de la consulta excede el tiempo establecido(timeout) y la transaccin se regresa a su estado original.

    Obj ect getSingleResult( )

    Este mtodo ejecuta una consulta SELECT que regresa un solo resultado sin tipo.

    Regresa:El resultado.

    Lanza:NoResul t Except i on Si no hay un resultado.NoUni queResul t Except i on Si hay ms de un resultado.

    I l l egal St at eExcept i on- Si se le llama con una sentencia UPDATE o DELETE en ellenguaje de consultas de la persistencia de Java, JPQL.

    Quer yTi meOut Except i on Si la ejecucin de la consulta excede el tiempo establecido(timeout) y slo la sentencia se regresa a su estado original.

    Per si st enceExcept i on Si la ejecucin de la consulta excede el tiempo establecido(timeout) y la transaccin se regresa a su estado original.

    i nt executeUpdate( )

    Este mtodo ejecuta una sentencia UPDATE o SELECT .

    Regresa:El nmero de entidades actualizadas o borradas.

    Lanza:

    I l l egal St at eExcept i on- Si se le llama con una sentencia SELECT en el lenguaje deconsultas de la persistencia de Java, JPQL.

    Tr ansact i onRequi r edExcept i on Si no hay una transaccin.

    Quer yTi meOut Except i on Si la ejecucin de la consulta excede el tiempo establecido(timeout) y slo la sentencia se regresa a su estado original.

    Per si st enceExcept i on Si la ejecucin de la consulta excede el tiempo establecido(timeout) y la transaccin se regresa a su estado original.

    Query setMaxResults( i nt maxResult)

    Establece el nmero mximo de resultados a obtener.

    Parmetros:maxResul t : El nmero mximo de resultados a obtener.

    Regresa:La misma instancia de la consulta.

    Lanza:

    I l l egal Ar gument Except i on Si el parmetro es negativo.Query setFirstResult( i nt startPosition)

    Establece la posicin del primer resultado a obtener.

    Parmetros:start Pos i t i on: Posicin del primer resultado a obtenerm numerados desde 0.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    47/55

    Tema 16 Acceso a Base de Datos Usando JPA 671

    ITSON Manuel Domitsu Kono

    Regresa:La misma instancia de la consulta.

    Lanza:

    I l l egal Ar gument Except i on Si el parmetro es negativo.

    QuerysetParameter( St r i ng name, Obj ect value)

    Liga un argumento a un parmetro nombrado

    Parmetros:

    name: Nombre del parmetro.

    value: Valor del parmetro.

    Regresa:La misma instancia de la consulta.

    Lanza:

    I l l egal Ar gument Except i on Si el parmetro name no corresponde a un parmetro de la

    consulta o si el argumento es del tipo incorrecto,

    Obtencin de un resultado simple

    Para obtener un solo resultado de una consulta, podemos utilizar el mtodo

    get Si ngl eResul t ( ) como se ilustra en el siguiente cdigo. Debemos estar segurosque la consulta slo generar un resultado:

    publ i c Genero f i ndGeneroByNombre( St r i ng nombre) {/ / Cr ea un admi ni st r ador de ent i dadesEnt i t yManager em = getEnt i t yManager( ) ;

    try {/ / Genera l a consul t a con nombr eQuery q = em. cr eat eNamedQuery( "Gener o. f i ndByNombre") ;/ / Est abl ece el nombr e del genero a buscarq. set Par ameter( "nombr e", nombre) ;

    / / Obt en y r egr esa el gener o de nombre nombrer etur n ( Genero) q.getSingleResult();

    } f i nal l y {em. cl ose( ) ;

    }}

    Obtencin de resultados mltiples

    Para obtener resultados mltiples de una consulta, podemos utilizar el mtodo

    get Resul t Li st ( ) como se ilustra en el siguiente cdigo:

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    48/55

    672 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    publ i c Li st f i ndByTi poMedi oGener oEnt i t i es( char t i poMedi o) {/ / Cr ea un admi ni st r ador de ent i dadesEnt i t yManager em = getEnt i t yManager( ) ;

    try {/ / Genera l a consul t a con nombr eQuer y q = em. cr eateNamedQuer y( "Genero. f i ndByTi poMedi o") ;/ / Est abl ece el t i po de medi o de l os gener os a buscarq. set Par amet er ( "t i poMedi o", t i poMedi o) ;

    / / Obten y regr esa l a l i st a de generos del mi smo t i po de medi oreturn q.getResultList();

    } f i nal l y {em. cl ose( ) ;

    }}

    Parmetros de una Consulta

    Si una consulta contiene la clausula WHERE, podemos hacer que la consulta tengaparmetros en los que se reciban los valores a emplearse en la clausula WHERE. Porejemplo en la siguiente consulta con nombre:

    @NamedQuer y( name = "Gener o. f i ndByNombr e" ,query = "SELECT g FROM Genero gWHERE g. nombr e = :nombre" ) ,

    La expresin :nombrees un parmetro en la que se recibir el nombre del gnero del

    que se har la bsqueda.

    Al crear la consulta podemos establecer el valor que tomar el parmetro :nombreusando el mtodo setParameter()como se muestra en el siguiente cdigo:

    publ i c Genero f i ndGeneroByNombre( St r i ng nombre) {/ / Cr ea un admi ni st r ador de ent i dadesEnt i t yManager em = getEnt i t yManager( ) ;

    try {/ / Genera l a consul t a con nombr eQuery q = em. cr eat eNamedQuery( "Gener o. f i ndByNombre") ;/ / Est abl ece el nombr e del genero a buscarq.setParameter("nombre", nombre);

    / / Obt en y r egr esa el gener o de nombre nombrer etur n ( Genero) q.getSingleResult();

    } f i nal l y {em. cl ose( ) ;

    }}

    La consulta puede tener ms de un parmetro. Sus valores se establecern con tantasinvocaciones al mtodo setParameter()como parmetros haya.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    49/55

    Tema 16 Acceso a Base de Datos Usando JPA 673

    ITSON Manuel Domitsu Kono

    Paginacin de resultados

    El resultado de una consulta puede generar cientos, miles o an millones de entidades.

    Puede no ser prctico o posible almacenarlos todos en una lista. La interfaz Querynospermite limitar el nmero de resultados a obtener y establecer la posicin del primer

    resultado de la lista. Para ello podemos utilizar los mtodos set Maxr esul t s( ) yset Fi r stResul t ( ) , respectivamente. El siguiente cdigo es un ejemplo del uso deesos mtodos:

    publ i c Li st f i ndGener oEnt i t i es( i nt maxResul t s, i nt f i r st Resul t ) {/ / Cr ea un admi ni st r ador de ent i dadesEnt i t yManager em = getEnt i t yManager( ) ;

    try {/ / Gener a el quer yQuer y q = em. cr eateQuer y( "sel ect obj ect ( o) f r omGener o as o") ;/ / Est abl ece el numero de generos a r ecuperar

    q.setMaxResults(maxResults);

    / / Est abl ece l a posi ci on del pr i mer gener o a r egr esarq.setFirstResult(firstResult);

    / / Obt i ene l a l i st a y l a r egr esaretur n q. get Resul t Li st( ) ;

    } f i nal l y {em. cl ose( ) ;

    }}

    El Lenguaje JPQL

    El lenguaje de Consultas de la Persistencia de Java, JPQL, es un lenguaje deconsultas similar a SQL slo que en lugar de operar sobre tablas, renglones ycolumnas como lo hace SQL, opera sobre entidades y sus atributos o propiedades.

    Las consultas de JPQL son traducidas a SQL por el parser de consultas de JPQL.

    Sentencias de JPQL

    JPQL soporta las sentencias mostradas en la tabla 16.7

    Tabla 16.7 Tipos de Sentencias de JPQLTipo de Sentencia Descripcin

    SELECT Recupera entidades o datos relacionados a entidadesUPDATE Actualiza una o ms entidadesDELETE Elimina una o ms entidades

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    50/55

    674 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    La Sentencia Select

    La sintaxis de la sentencia select es:

    clausula Select

    clausula From[clausula Where]

    [clausula Group by [clausula Having]]

    [clausula Order by]

    Clausula Select

    La clausula Select define los resultados de la consulta. Su sintaxis es:

    SELECT [ DISTINT] expresion1[ , expresion2] . . .

    Donde DISTINTelimina los resultados repetidos.

    expresion1es una expresin que establece el resultado de la consulta. Y puede ser:

    Una variable de identificacin que identifica a una. Por ejemplo la sentencia:

    SELECT g FROM Genero g

    Regresara un objeto de tipo Genero (o una coleccin de tipo Genero,dependiendo de la clausula Where).

    Una expresin de trayectoria que identifica un atributo o propiedad de unaentidad. Por ejemplo la sentencia:

    SELECT g. nombr e FROM Genero g

    Regresara un String con el nombre de un genero (o una coleccin de tipo String,dependiendo de la clausula Where).

    Un constructor de la clase. En este caso los resultados de la consulta se usaranpara formar un objeto de la clase del constructor. Por ejemplo la sentencia:

    SELECT NEW obj et osNegoci o. Cont act o( c. t el ef ono, c. emai l )FROM cl i ent e c

    Regresara un objeto de tipo obj et osnegoci o. Cont act o (o una coleccin detipo Contacto, dependiendo de la clausula Where). Aqu suponemos quetenemos la siguiente clase:

    publ i c cl ass Cont act o {pr i vat e St r i ng t el ef ono;pr i vat e St r i ng emai l ;

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    51/55

    Tema 16 Acceso a Base de Datos Usando JPA 675

    ITSON Manuel Domitsu Kono

    publ i c Cont act o( St r i ng t el ef ono, St r i ng emai l ) {t hi s. t el ef ono = t el ef ono;t hi s. emai l = emai l :

    }

    . . .}

    Una agregacin. Para ello JPQL soporta las funciones de la tabla 16.8

    Tabla 16.8 Funciones de Agregacin de JPQLFuncin de Agregacin Descripcin Tipo Regresado

    AVG Regresa el valor promedio de los valores delcampo al que se aplica

    Doubl e

    COUNT Regresa el nmero de resultados regresados porla consulta

    Long

    MAX Regresa el valor mximo de los valores delcampo al que se aplica

    Depende del tipo delcampo al que se aplica

    MI N Regresa el valor mnimo de los valores del campo

    al que se aplica

    Depende del tipo del

    campo al que se aplicaSUM Regresa la suma de los valores del campo al que

    se aplicaDoubl eo Long

    Por ejemplo la sentencia:

    SELECT AVG( c. dur aci on) FROM Canci on c

    Regresara un Double con la duracin promedio de las canciones.

    SELECT MAX( p. dur aci on) FROM Pel i cul a p

    Regresara un Double con la duracin de la pelcula ms larga.

    Por ltimo:

    SELECT COUNT( c) FROM Canci on c

    Regresara el nmero de canciones.

    En el caso de expresiones mltiples, se regresar un arreglo de tipo Object.Cada elemento del arreglo contiene el resultado de cada expresin. Por ejemplola sentencia:

    SELECT g. cl ave, g. nombre FROM Genero g

    Regresara un arreglo de tamao 2 del tipo String con la clave en el elemento 0 yel nombre wn wl wlwmwnto 1 (o una coleccin de arreglos de tamao 2 del tipoString, dependiendo de la clausula Where).

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    52/55

    676 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Clausula From

    La clausula FROM establece los nombres de las entidades que sern usadas en laconsulta, asocindoles variables de identificacin. Una clausula from puede tenervarias variables de identificacin separadas por comas. Las variables de identificacin

    deben ser identificadores vlidos de java y no pueden ser ninguno de los nombresreservados de JPQL. La tabla 16.9 lista todos los nombres reservados de JPQL-

    Tabla 16.9 Nombres Reservados de JPQLSELECTFROMWHEREUPDATEDELETE

    J OI NOUTERI NNERLEFT

    GROUPBYHAVI NGFETCHDI STI NCT

    OBJ ECTNULL

    TRUEFALSENOTANDORBETWEENLI KE

    I NASUNKNOWNEMPTYMEMBER

    OFI S AVGMAXMI NSUMCOUNTORDERBYASC

    DESCMODUPPERLOWER

    TRI M

    POSI TI ONCHARACTER_LENGTHCHAR_LENGTHBI T_LENGTHCURRENT_TI MECURRENT_DATECURRENT_TI MESTAMPNEWEXI STS

    ALLANYSOME

    La sintaxis de una clausula FROM es la siguiente:

    FROM nombreEntidad [AS] variableIdentificacion

    Clausula Where

    La clausula Where permite filtrar los resultados de la consulta. Slo las entidades quecumplen con la condicin establecida por la clausula Where sern recuperadas. Lasintaxis de una clausula Where es la siguiente:

    WHERE expresin

    Donde expresin puede contener variables de identificacin, expresiones detrayectoria, y los operadores soportados por el lenguaje JPQL. La tabla 16.10 muestralos operadores soportados por JPQL en orden de precedencia.

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    53/55

    Tema 16 Acceso a Base de Datos Usando JPA 677

    ITSON Manuel Domitsu Kono

    Tabla 16.10 Operadores de JPQLTipo de Operador Operador

    Navegacional .Signo +, -

    Aritmticos * , /+, -

    Relacional =, >, >=,

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    54/55

    678 Acceso a Base de Datos Usando JPA

    ITSON Manuel Domitsu Kono

    Regresara el nmero de canciones para cada intrprete en una lista de objetos

    de objetos de tipo ut i l s. Cuent aCanci onesI nt er pr et e, cuyo cdigo parciales:

    package ut i l s;i mport obj et osNegoci o. Canci on;

    publ i c cl ass Cuent aCanci onesI nt erpret e {pr i vat e St r i ng i nt er pr et e;pr i vat e Long cuent a;

    publ i c Cuent aCanci onesI nt er pr et e( ) {}

    publ i c Cuent aCanci onesI nt er pr et e( St r i ng i nt er pr et e,Long cuent a) {

    t hi s. i nt er pr et e = i nt er pr et e;t hi s. cuent a = cuent a;

    }

    @Over r i depubl i c St r i ng t oSt r i ng( ) {

    r et ur n i nt er pr et e + ", " + cuent a;}

    }

    Clausula Having

    La clausula Having define un filtro que se aplicar despus de que los resultados hayansido agrupados. Equivale a una clausula Where secundaria. Su sintaxis es similar a lade la clausula Where.

    HAVING expresin

    La expresin slo puede tener laexpresin de trayectoria simple o la variable deidentificacin usada en la clausula Group By. La expresin condicional de la clausulaHaving puede contener funciones de agregacin.

    La sentencia:

    SELECT NEW ut i l s. Cuent aCanci onesGenero(c. genero. nombr e, count ( c) )FROM Canci on c GROUP BY c. genero. nombr e HAVI NG c. genero. nombr e =

    : nomGener o

    Regresara el nmero de canciones que son baladas en una lista de objetos de

    objetos de tipo ut i l s. Cuent aCanci onesGener o, cuyo cdigo parcial es:

    package ut i l s;

    / * **

  • 7/22/2019 Tema 16 - Acceso a Base de Datos Usando JPA

    55/55

    Tema 16 Acceso a Base de Datos Usando JPA 679

    * @aut hor mdomi t su*/

    publ i c cl ass CuentaCanci onesGenero {pr i vat e St r i ng nomGenero;pr i vat e Long cuent a;

    publ i c Cuent aCanci onesGenero( ) {}

    publ i c CuentaCanci onesGenero( St r i ng nomGenero, Long cuent a) {t hi s. nomGenero = nomGenero;t hi s. cuent a = cuent a;

    }

    @Over r i depubl i c St r i ng t oSt r i ng( ) {

    r et urn nomGenero + " , " + cuent a;}

    }

    Clausula Order By

    La clausula Order By permite ordenar los resultados de la consulta usando una o msexpresiones que contengan variables de identificacin o expresiones de trayectoria que

    den como resultado una entidad o atributo. Las palabras reservadas ASCy DESCpermiten establecer que el ordenamiento sea ascendente o descendente. El valor por

    omicin es ASC. La sintaxis de una clausula Order By es la