20260115 JPA_4 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Venga, a ver, vamos a revisar rápidamente el main ese que
00:00:00
hemos hecho, que decía él por si alguien, ¿vale?
00:00:03
Pues, a ver, este es la unidad de persistencia o el contexto de
00:00:06
persistencia.
00:00:11
Dentro de él y hasta que aparezca un close,
00:00:11
podemos manejar objetos persistentes y también que no
00:00:16
lo sean, por supuesto, transitorios.
00:00:20
Bueno, siempre se recomienda trabajar en el contexto de
00:00:22
transacciones.
00:00:25
Cuando se modifica la base de datos, obligatorio,
00:00:26
aunque no sea transacción como tal
00:00:28
porque no tengo varias sentencias, pero no ha sido obligatorio
00:00:30
si no, no
00:00:32
¿lo sentís mucho?
00:00:33
no, es mentira, no lo sentís mucho
00:00:38
es una forma de hablar
00:00:40
¿lo sentís mucho de verdad?
00:00:40
pero, ah, vale, vale
00:00:44
¿desde cuándo no se puede subir
00:00:46
hasta menos de 20?
00:00:50
eso yo no lo sé
00:00:53
eso yo no tengo ni idea
00:00:54
pregunto al agajo, no tengo ni idea
00:00:55
¿Y eso qué significa?
00:00:57
Significa nada, no lo sé
00:00:59
Vale, a mí nada
00:01:01
Venga, volvemos
00:01:04
Este es el contexto de persistencia
00:01:05
Recomendable, trabajar con transacciones
00:01:07
Obligatorio cuando se modifica la base de datos
00:01:09
Cuando solo se consulta no, pero bueno
00:01:12
Es un hábito
00:01:14
¿Qué habíamos hecho en este mail?
00:01:14
Creamos un objeto, ahora mismo es transitorio
00:01:17
Y ya está
00:01:20
Con persist lo hacemos persistente
00:01:20
Lo cual tiene como efecto
00:01:23
Insertarlo en la base de datos
00:01:25
¿Vale? Como la clave es autogenerada
00:01:27
Se quedará una clave y ya está
00:01:29
Si no fuera clave autogenerada
00:01:31
Si la clave primaria fuera el nombre
00:01:33
Por ejemplo, y ya hubiera uno que se llama casa
00:01:35
Si probáis a hacerlo, veréis como dice
00:01:37
Un error de clave primaria
00:01:40
Pero bueno, será esperable
00:01:42
Claro, claro
00:01:43
Si como consecuencia, porque lo que
00:01:46
Por debajo llama esto es a un insert de jdbc
00:01:49
Si ese insert falla, pues se lo va a decir
00:01:52
Claro, ahora, ¿qué habíamos hecho en este main?
00:01:53
Cogíamos un empleado al que le íbamos a poner
00:01:56
Este departamento porque lo queríamos cambiar
00:01:58
Con este método find que te recupera
00:02:00
Por clave primaria
00:02:03
¿Vale? Y le decimos
00:02:04
A qué clase va a caer
00:02:06
Bueno, ahora
00:02:07
Cogíamos
00:02:09
Esto para mostrarle para el empleado
00:02:14
Ahora le cambiamos el departamento
00:02:17
Es decir, a este empleado
00:02:19
Le poníamos el departamento
00:02:20
Nuevo que acabamos de coger
00:02:23
Le poníamos ese departamento
00:02:25
¿Vale? Hacíamos la transacción
00:02:27
Para que se hiciera
00:02:30
Y ahora, yo ahora
00:02:31
Esto no estaba antes
00:02:33
Yo ahora quiero acceder
00:02:35
Al objeto departamento
00:02:38
Y a sus empleados en particular
00:02:39
Que tendrá este nuevo
00:02:42
Que le acabo de meter
00:02:44
No era un departamento nuevo, tendrá este nuevo
00:02:45
Pero claro, lo que yo quería hacer antes
00:02:47
Es, oye, como he hecho cambios
00:02:50
En los objetos, refrescámelo
00:02:52
¿Vale? O sea, a empleado le he cambiado
00:02:54
El departamento
00:02:57
Refrescame departamento
00:02:58
Para que se actualice
00:03:01
Su propiedad de empleados
00:03:02
Entonces yo estaba enterrada en el flush
00:03:04
Y luego ya me dio la cabeza que era el refresh
00:03:05
¿Vale? Entonces ahora ya sí
00:03:08
Vamos a coger los empleados
00:03:11
De departamento, que me va a aparecer este
00:03:13
Que le acabo de meter
00:03:15
Me va a aparecer este y aquí pues uno ya hace
00:03:16
Lo que le dé la gana, en mi caso era el stream
00:03:19
Pero eso ya lo habíamos metido en otro sitio
00:03:21
y ya está
00:03:22
vale, esto en cuanto a esto de aquí
00:03:24
ahora, el otro método
00:03:26
que habíamos probado
00:03:28
el flush
00:03:30
creo recordar que te
00:03:34
si tú has hecho un
00:03:35
un get
00:03:37
o sea, si tú has hecho un cambio en la base de datos
00:03:40
te refresca ese cambio
00:03:42
pero aquí no ha sido eso, aquí hemos cambiado
00:03:43
los objetos, o sea, el flush es con la base
00:03:46
de datos, el refresh es
00:03:48
sincronización entre los objetos
00:03:50
¿vale? es decir, yo aquí he cambiado
00:03:51
el departamento
00:03:55
¿vale? he cambiado el departamento y ya está
00:03:56
y esto de hecho
00:03:59
lo podría quitar, no me hace falta
00:04:01
esto no, la base de datos
00:04:02
entonces, hibernate deja
00:04:04
marcado en su mundo
00:04:06
de los objetos, él va dejando
00:04:08
las marcas de lo que va haciendo para cuando
00:04:10
luego te da que hacer commit o lo que sea
00:04:12
¿vale? cuando luego te da que hacer
00:04:14
pues en el mundo de los objetos, él ya deja
00:04:16
marcado que este empleado está
00:04:18
en este departamento, pero yo
00:04:20
el objeto correspondiente lo quiero
00:04:22
sincronizar, o sea, el rifle es una sincronización
00:04:24
entre los objetos, para que los objetos queden coherentes
00:04:26
pero no estoy haciendo nada con la base de datos
00:04:28
¿vale?
00:04:30
entonces, ahora ya el objeto departamento
00:04:32
el contexto de persistencia
00:04:35
lo refresca para que se quede
00:04:36
coherente con esto que acabo de hacer
00:04:38
para que se quede coherente
00:04:40
que luego yo todo esto que estoy haciendo en los objetos
00:04:41
quiero ya que se refleje en la base de datos
00:04:44
pues entonces ya hago el comando
00:04:47
¿vale?
00:04:48
el flush es pues eso
00:04:50
ha habido un cambio en la base de datos y yo quiero que mis objetos
00:04:52
se enteren, hago un flush y ya está
00:04:54
yo no lo he probado
00:04:55
pero es como se supone que funciona
00:05:01
vale
00:05:02
vale, entonces
00:05:03
ahora, siguiente método que habíamos
00:05:06
hecho, pues este
00:05:08
otro contexto de persistencia, nos cogíamos
00:05:10
el departamento, cogíamos
00:05:12
sus empleados, les cambiábamos
00:05:14
el nombre y ya hemos visto que funciona
00:05:17
y ya está, algunas pruebitas que hemos hecho
00:05:18
para ver un poquito por encima cómo funciona JPA
00:05:21
que habéis visto
00:05:23
que es más fácil, trabajo con los objetos
00:05:24
y me olvido del JDBC
00:05:27
y del SQL
00:05:28
me olvido del SQL entre comillas
00:05:30
porque
00:05:33
sí, bueno, eso por
00:05:35
descontado, pero también
00:05:37
me olvido, pero perdón
00:05:39
tampoco me puedo olvidar del todo
00:05:40
porque si yo quiero hacer consultas raras
00:05:42
que no sea una por clave primaria
00:05:44
como me la da el FINE
00:05:47
la tengo que hacer con un lenguaje propio
00:05:48
de JPA que es el JPQL
00:05:50
que se parece mucho al SQL
00:05:53
pero no lo es
00:05:54
¿vale? entonces yo quiero
00:05:55
recógeme
00:05:59
los empleados cuyo departamento
00:06:00
empieza por
00:06:03
mayúscula
00:06:04
esa consulta JPA no la tiene, la tenemos que construir
00:06:05
entonces tendríamos
00:06:08
que hacer un JP
00:06:10
una sentencia JPQL
00:06:12
que es muy parecida a SQL
00:06:14
por ejemplo
00:06:16
Vamos a hacer aquí
00:06:17
Vamos a hacer una consulta
00:06:19
Que
00:06:21
Recoger
00:06:21
Todos los
00:06:26
Empleados
00:06:27
Que
00:06:29
Recoger por otro campo, ya está, más sencillo
00:06:34
Todos los empleados que se llamen
00:06:38
Ana barra baja
00:06:42
Como tengo dos me dará dos
00:06:43
Vale, pues a ver
00:06:45
O sea, recoger empleados por nombre
00:06:47
En definitiva
00:06:48
Vamos a hacernos aquí un método
00:06:49
Ahí mismo
00:06:52
Entonces
00:06:54
Esto me va a dar
00:06:59
Una lista de empleados
00:07:01
Vale, pues aquí tendría que hacer
00:07:02
Esto también
00:07:25
De nuevo, como aquí voy a leer
00:07:27
La transacción
00:07:34
No es obligatoria
00:07:36
Pero bueno, es un buen hábito
00:07:37
Ponerla siempre
00:07:39
Porque no molesta, desde luego daño no va a hacer
00:07:41
Y aquí tendríamos
00:07:44
un em.close
00:07:56
Vale, pues aquí es donde tenemos que
00:07:58
ver qué hago yo para sacar esta lista
00:08:00
de empleados
00:08:03
Esta lista de aquí, ¿cómo la saco?
00:08:04
Esto va a ser una query, tenemos que
00:08:07
hacer una query
00:08:09
El find de em
00:08:09
no nos vale
00:08:12
Este, bueno, no vale
00:08:13
porque este recupera por clave primaria
00:08:17
solamente
00:08:19
Vale, pues entonces, tenemos que
00:08:19
hacer una consulta en el lenguaje
00:08:22
jpul
00:08:24
una query
00:08:26
en el lenguaje jpql
00:08:28
jpql es muy parecido
00:08:29
a sql, muy parecido
00:08:32
pero
00:08:34
los nombres de las tablas
00:08:34
ahora serán los nombres de las clases
00:08:37
y los nombres de los
00:08:39
campos ahora serán los nombres
00:08:42
de las propiedades
00:08:44
para todo lo demás
00:08:45
sería casi equivalente
00:08:48
pero tú en sql que haces
00:08:49
consultas en tablas
00:08:51
nombres de campos
00:08:53
Pues aquí consultas en nombres de clases, nombres de propiedades. Entonces, en JPQL, pues uno lo puede estudiar al detalle o ver un poquito por encima cómo funciona para saberlo y luego ya cuando tiene que hacer algo, preguntárselo a HGPT. Esa sería nuestra opción, lógicamente.
00:08:55
saber de qué va, cómo funciona
00:09:17
y uno quiere...
00:09:20
No, en el examen no, porque yo en el examen no te pido
00:09:21
cosas muy específicas.
00:09:24
Te pido lo que hemos
00:09:26
mencionado aquí.
00:09:27
Entonces, todo lo que
00:09:30
os pido en el examen, lo sabéis
00:09:32
hacer. Luego, otra
00:09:34
cosa es que uno ya se ponga a hacer un proyecto que
00:09:36
necesita cosas muy específicas.
00:09:37
Uy, una consulta que me tiene que hacer,
00:09:40
coger la inicial de no sé qué y hacerme
00:09:41
no sé cuántos, pues esa consulta,
00:09:43
como la tienes muy acotada lo que quieres
00:09:45
se la pides, esa es nuestra manera
00:09:48
de trabajar, verdad
00:09:50
vale, pero esta query es facilita, esta query
00:09:51
es, vamos a seleccionar
00:09:54
el que vamos a seleccionar
00:09:57
todo un empleado
00:09:59
entero
00:10:00
empleado, obligatorio poner
00:10:01
un alias en JPQL
00:10:04
from
00:10:06
¿de qué tabla? from empleado
00:10:09
no, pero estoy seleccionando empleados por nombre
00:10:12
Porque he roto el stream
00:10:16
Bueno, para que me quepa en la pantalla
00:10:29
Pero si no, poner el multilínea
00:10:32
Con los tres, lo que sea
00:10:34
Where
00:10:36
E.nombre
00:10:39
Igual a
00:10:42
Y aquí es donde
00:10:46
Si fuera jdbc
00:10:47
Se pondría la interrogación
00:10:49
Pero aquí no se pone la interrogación
00:10:51
aquí se pone dos puntos y el nombre que le doy
00:10:53
a este parámetro que luego voy a inyectar
00:10:55
llamémosle nombre el que sea
00:10:58
vale
00:10:59
entonces
00:11:01
aquí que estoy haciendo mal
00:11:02
ah bueno que estoy aquí está
00:11:05
vale voy a dejar así para que no
00:11:06
moleste
00:11:09
vale bueno pues ahora
00:11:11
tenemos que hacer una query
00:11:13
una query que esta la sacamos
00:11:15
de em
00:11:20
a ver si veo que pierdo mucho tiempo
00:11:21
no create query
00:11:24
Lo miro en la chuleta y ya está
00:11:25
Esto será
00:11:28
Create
00:11:29
Query
00:11:31
Vale
00:11:33
Y ahora aquí
00:11:34
Le ponemos la query
00:11:36
Import query de Jakarta
00:11:39
Persistence, vale
00:11:46
Y se llaman igual, vale
00:11:48
String
00:11:53
JPQL
00:11:54
Lo vamos a llamar JPQL
00:11:57
jpql
00:11:59
vale, y ahora la query
00:12:03
hay que fijarle el parámetro
00:12:05
query.tendrá un set parameter
00:12:07
vale
00:12:10
el parámetro de posición
00:12:10
que se llama nom
00:12:13
perdón
00:12:15
también se puede acceder por posición
00:12:17
le vamos a dar
00:12:19
el parámetro de aquí arriba del
00:12:21
método que era nombre
00:12:23
mi parámetro
00:12:25
del método
00:12:28
vale, y ahora
00:12:28
a esta query que ya le he fijado el parámetro
00:12:35
le puedo sacar ya
00:12:37
el get result list
00:12:39
y ya esto va aquí
00:12:41
o sea, lo he hecho todo línea por línea
00:12:43
esto sería en una línea normalmente
00:12:45
vale, me dice que claro
00:12:46
es un casting sin chequear
00:12:54
sí, claro que es un casting
00:12:57
sin chequear, pero así es la vida
00:12:59
hay que confiar en que
00:13:01
yo he hecho bien
00:13:03
el jpql de arriba
00:13:05
Bueno, pues esta es la idea de JPQL
00:13:06
Parecido a SQL
00:13:14
Es un mundo de detalles
00:13:16
Y de historias al conocerlo
00:13:18
No es nuestra intención
00:13:19
Yo aquí estoy cogiendo el objeto entero
00:13:21
Podría coger
00:13:23
Solo propiedades sueltas
00:13:25
Entonces no sería un list de empleados
00:13:27
Sino un list de integer, de lo que fuera
00:13:30
Vale, no tengo que coger siempre objetos enteros
00:13:31
Puedo coger propiedades sueltas
00:13:34
Vale, fijo tantos parámetros
00:13:36
Como quiera
00:13:38
puede hacer join, puede hacer de todo
00:13:39
meterse en jpql ya sería
00:13:41
otro tema para el que no tenemos
00:13:45
tiempo
00:13:47
¿vale? entonces lo normal
00:13:48
aquí es anidarlo todo
00:13:51
pues desde empleados de arriba
00:13:53
habríamos hecho el createquery
00:13:55
setparameter de resundice
00:13:57
lo normal es que lo hubiéramos todo
00:13:59
metido en una única línea
00:14:01
¿vale? pero bueno
00:14:03
a partir de aquí podría yo tirar con el
00:14:05
create query, bla, bla, bla, bla, bla, y lo tengo
00:14:07
todo en una línea. Pero así
00:14:09
en principio se ve más claro.
00:14:11
A ver, vamos a probarlo
00:14:14
desde nuestro main. Ah, bueno,
00:14:15
que no he hecho el return.
00:14:17
Return empleados.
00:14:25
Vale.
00:14:31
¿El alias no es en el front?
00:14:38
Vamos a probarlo.
00:14:46
En SQL es en el front.
00:14:51
Pero aquí es que
00:14:53
En el front me está sonando raro a la vista
00:14:54
Vamos a probarlo
00:14:57
Y si no lo cambiamos
00:14:58
Vámonos al main
00:14:59
En mi caso
00:15:08
Yo voy a coger
00:15:15
Ana barra baja
00:15:16
Y ahora voy a mostrarlo todo
00:15:18
Get empleados
00:15:27
Esto voy a hacer
00:15:29
Punto
00:15:32
String
00:15:35
Punto for each
00:15:36
Que me los muestre
00:15:38
Vale, entonces como no tengo un toString
00:15:42
Empleado
00:16:08
Me va a salir un poco feo
00:16:10
Vamos a hacer un toString rápido
00:16:11
Un toString rápido
00:16:13
Sin el departamento
00:16:20
Con id y nombre
00:16:21
Vale, alguien llama por ahí
00:16:23
Si
00:16:28
Igualmente
00:16:30
vale, vamos a ver si
00:16:33
la jpql
00:16:36
la hemos escrito bien, igual no está bien escrita
00:16:38
en ese caso uno lo consulta
00:16:40
y dice, ah, es que he puesto el de donde no es
00:16:42
venga, vale
00:16:43
interpret expression
00:16:52
e.nombre, vale
00:16:56
efectivamente el alias
00:16:57
lo he puesto
00:16:58
select
00:17:00
es que
00:17:01
hay otro lenguaje
00:17:05
que es hql
00:17:07
No, no me
00:17:08
A ver, es que HQL es el propio
00:17:11
De consulta de hibernate
00:17:14
¿Vale? Que se parece a JPQL
00:17:15
Pero no, entonces a veces los mezclo los dos
00:17:18
Y prefiero, en lugar de mirarlo
00:17:20
Que lo hagamos como nos sale
00:17:22
Porque si nos salen errores
00:17:24
Eso hace que doblemente lo aprendamos
00:17:25
Pues hemos tenido que trabajarlo dos veces
00:17:28
Select
00:17:29
A ver, si es así
00:17:31
De empleado es
00:17:35
Selecciona el objeto enterito
00:17:37
Si no, podría yo seleccionar solamente el nombre
00:17:38
El que fuera
00:17:41
No, vamos a seleccionar el objeto enterito
00:17:41
Para que sea un list de empleados
00:17:44
Vamos a ver ahora
00:17:46
¿Tampoco?
00:17:48
Ah, no, pues a mí no
00:17:53
Entonces yo que he escrito mal
00:17:54
Mis matches de input
00:17:55
Expecting one of the following
00:17:58
Que he escrito mal
00:18:00
ah, vale, en mi caso era
00:18:02
en mi caso era porque no había puesto aquí el espacio
00:18:16
vale, entonces tenía
00:18:18
el ewer todo seguido
00:18:20
vale, pero ya sí que funciona así
00:18:21
el alias efectivamente
00:18:23
estaba mal puesto, menos mal que tengo un secretario
00:18:26
muy cualificado
00:18:28
¿subir es ir para allá?
00:18:35
¿hasta dónde?
00:18:36
arriba es el main
00:18:38
es un poquito rara
00:18:39
la sintaxis esta
00:18:46
en SQL
00:18:48
tú piensas en SQL
00:18:50
pero
00:18:53
navegando por tablas
00:18:54
y propiedades, perdón, navegando por
00:18:56
clases y propiedades de campos
00:18:58
propiedades de clases en lugar de por tablas
00:19:00
y campos, y ya está
00:19:02
y luego el resto de la sintaxis
00:19:04
para los join, para todo es igual
00:19:06
lo único es
00:19:08
esto, que jpql
00:19:10
¿por qué hql no?
00:19:12
por eso siempre me lío, pero JPQL
00:19:13
te obliga a poner
00:19:15
un alias a la tabla
00:19:18
en la que estás accediendo, en este caso la clase
00:19:19
y luego ya con el alias
00:19:22
ya aquí recoges de ella lo que quieras
00:19:24
vale
00:19:26
vale, pues esto en cuanto a JPQL
00:19:28
bueno, vistazo muy por encima
00:19:34
de JPA, pero más o menos
00:19:37
la idea la tenemos de que va
00:19:39
perdón
00:19:41
¿cómo?
00:19:43
¿Y si me lo está haciendo? Espérate. Sí, están aquí. Le he puesto en tu stream. Vale. Bueno, pues entonces, esto de JPA está muy bien, pero realmente lo hemos puesto en práctica en una estructura muy chapucera, ¿no? Con un main.
00:19:45
Primer paso, vamos a darle
00:20:13
Otro diseño
00:20:15
Con DAOs y servicios
00:20:18
¿Vale?
00:20:20
Eso nos permite ya entrar un poquito con
00:20:21
Las transacciones
00:20:23
Vale, pues vamos a darle otro diseño
00:20:26
Entonces este main no nos molesta
00:20:29
Se queda aquí como mi main de pruebas
00:20:33
No lo vamos a borrar
00:20:37
Tengo las entidades
00:20:38
¿Vale? ¿Qué es lo siguiente que hacemos cuando hacemos este patrón?
00:20:40
Pues los DAOs
00:20:43
Que el XML se ponga mal
00:20:44
Como el Pong
00:20:56
El del Persistent
00:20:56
Y a mí es que ese no se me ha puesto mal nunca
00:20:57
No sé por qué se os pone mal
00:20:59
Y sí, ¿no?
00:21:02
Es que si a mí se pusiera rojo
00:21:05
Vamos, removería cielo y tierra hasta que se quita el rojo
00:21:07
Pero es que nunca me ha pasado
00:21:09
Entonces no tengo ni idea
00:21:11
No sé deciros
00:21:12
Es decir, os da un error
00:21:13
Por
00:21:20
Si ponéis una S se quita
00:21:20
aquí
00:21:23
y si ponéis una S y quitáis este atributo
00:21:25
¿lo habéis probado?
00:21:28
porque el error se quitaría
00:21:31
y puede que os funcionara
00:21:32
el
00:21:34
pero vamos, eso habrá que averiguarlo
00:21:36
porque es un rollo
00:21:41
que eso esté así
00:21:42
claro, pero cuando tú pones aquí una S
00:21:43
lo que os está diciendo, por lo que he visto
00:21:45
es que el esquema Location
00:21:48
se ha quitado y no da error
00:21:49
es que eso lo intuía
00:21:52
bueno, pues
00:21:53
a ver, mientras funcione
00:21:55
lo dejamos así
00:21:57
claro
00:21:58
vale
00:22:01
vamos a ver, entonces
00:22:03
vamos al DAO
00:22:05
y ahora sí que
00:22:09
venga, vamos a jugar
00:22:11
¿vale?
00:22:13
porque os gusta jugar
00:22:15
bueno, ¿lo vas a hacer un cajón?
00:22:16
no, no lo voy a hacer un cajón
00:22:19
vamos a jugar con el cerebro
00:22:21
vamos a jugar moviendo las neuronas
00:22:23
que nos encantan, entonces
00:22:25
vamos a pensar, imaginaos que tenemos que hacer
00:22:27
un CRUD básico
00:22:30
vamos a reactivarlas
00:22:32
que si no luego nos llega muy rápido el deterioro
00:22:35
cognitivo
00:22:38
vamos a hacer, imaginaos que lo que
00:22:38
tenemos que hacer con departamento y empleado es un CRUD
00:22:42
básico, create
00:22:44
departamento, delete departamento
00:22:46
create empleado, delete
00:22:48
empleado, pues
00:22:50
¿para qué vamos a duplicar?
00:22:51
empleado DAO, departamento DAO
00:22:53
vamos a hacernos un DAO genérico
00:22:56
con el tipo genérico
00:22:58
vale
00:22:59
y así
00:23:01
pues
00:23:03
refrescamos ciertas ideas
00:23:05
y nos abrimos a ciertos
00:23:08
diseños, vamos a hacernos un
00:23:10
DAO
00:23:12
general, genérico
00:23:14
para todos
00:23:16
este que me valga para todos
00:23:20
interfaz, perdón
00:23:25
Que estoy en las interfaces
00:23:28
Este es el interfaz, todavía no es la implementación
00:23:29
Vale, pues a ver
00:23:34
¿Qué es lo que quiero hacer?
00:23:36
Yo quiero hacer un create
00:23:37
Lo que sea
00:23:39
Departamento empleado, un create
00:23:41
¿Y aquí qué le pasaré?
00:23:43
Departamento o empleado, no sé lo que le pasaré
00:23:46
Con lo cual le paso el tipo genérico
00:23:48
¿Vale?
00:23:50
Objeto, object, como lo queramos llamar
00:23:55
¿Y ahora qué ocurre?
00:23:56
Que mi clase la he convertido
00:24:02
A mi interfaz automáticamente
00:24:04
La he convertido en genérica
00:24:06
¿Vale?
00:24:09
¿Qué me dice esto?
00:24:13
Perdón
00:24:21
Estoy poniendo esto donde no es
00:24:21
Vale
00:24:23
El nombrecito que he elegido
00:24:25
Creo que está muy mal
00:24:30
Entidad, lo que sea, objeto
00:24:32
No, pero no es por eso
00:24:35
¿Por qué me...?
00:24:37
¿Qué llaves?
00:24:38
¿Pero dónde he puesto un punto y coma?
00:24:41
¡Ah!
00:24:43
¡Ah, que sí, que sí, jolines!
00:24:45
Vale, vale, vale
00:24:47
Puedo poner object porque la mayúscula no le molesta
00:24:49
O sea, no
00:24:52
Podría poner object, vale, vale
00:24:52
Vale
00:24:55
Queremos crear lo que sea
00:24:56
¿Qué más queremos?
00:24:59
Queremos recuperar
00:25:01
Por clave primaria
00:25:02
Pero aquí la hemos liado
00:25:05
La clave primaria coincide en este caso
00:25:07
Que se entera para ambas, tanto departamento como id
00:25:09
Pero podría no serlo
00:25:12
Entonces, este es un nuevo tipo genérico
00:25:13
con lo cual este es doblemente
00:25:15
genérico
00:25:21
no, no, no, cómo te vas a perder
00:25:22
cuál es el CRUD básico
00:25:27
insertar, recuperar, eliminar y actualizar
00:25:30
pues eliminar
00:25:33
estoy poniendo void todo el rato
00:25:35
siempre es más bonito un boolean
00:25:36
o algo que te permita validar
00:25:38
si está bien o el número
00:25:41
de registros creados, en este caso uno
00:25:43
pero bueno, estoy poniendo un void
00:25:45
por comodidad
00:25:46
vale, aquí sería
00:25:47
REMUD
00:25:49
que, pues el objeto
00:25:51
y ahora UDATE
00:25:52
UDATE
00:25:57
vale, pues este es el
00:26:01
CRUD básico, y es que
00:26:09
va a ser el mismo para departamento, para
00:26:11
empleado, para Pepito Pérez
00:26:13
para cualquiera, va a ser el mismo
00:26:15
entonces hagamos lo genérico
00:26:17
y ya está, genérico depende de dos
00:26:19
cosas, de la clave que
00:26:21
necesitamos para el GET
00:26:23
y del propio tipo de dato
00:26:25
Vale, pues
00:26:27
Ahora
00:26:42
Vamos a hacer la implementación de esto
00:26:44
Normalmente sí
00:26:46
Normalmente sí
00:27:05
Vale, pues esta, yo que sé
00:27:08
Implementación da
00:27:17
Y esta que implementa
00:27:18
Implements
00:27:28
Que implementa, pues
00:27:30
esta otra, generic
00:27:31
dao, vale
00:27:34
generic dao de
00:27:36
t, k
00:27:40
vale
00:27:42
t, ah sí
00:27:44
k, me he confundido de clave
00:27:46
vale
00:27:48
dao
00:27:49
t, v, y ahora
00:27:54
vale, entonces
00:27:57
tenemos que implementar estos métodos
00:28:02
vale
00:28:04
entonces, estos
00:28:06
métodos
00:28:08
siguen dependiendo
00:28:09
yo haré el persist de este objeto
00:28:12
haré lo que sea
00:28:14
esta clase sigue dependiendo de t y v
00:28:15
con lo cual esto sigue siendo
00:28:18
genérico así
00:28:20
uy jolín con la k
00:28:21
esa vez
00:28:26
vale
00:28:27
no
00:28:28
a ver los paquetes no van unos dentro de otros
00:28:52
la carpeta si
00:28:55
como he puesto un punto
00:28:57
la carpeta físicamente estará ubicada
00:28:58
pero los paquetes están siempre
00:29:01
desde la raíz
00:29:03
vale, pues entonces, aquí
00:29:05
crear, pues aquí voy a
00:29:17
copiar todo esto de aquí
00:29:25
a ver
00:29:27
es que esto no es una conexión
00:29:42
en realidad, se puede
00:29:45
en una aplicación pequeña, controlada
00:29:46
tú puedes hacer un entity manager que está
00:29:49
ahí vivo todo el rato, pero es que
00:29:51
esto no es solo una conexión
00:29:53
o sea, esto es todo un contexto con objetos
00:29:54
manejados, marcados
00:29:57
entonces si tú haces uno único
00:29:58
en una aplicación grande puede haber
00:30:00
muchos efectos secundarios
00:30:03
de mezcla de objetos
00:30:04
de que unos objetos tengan efectos
00:30:06
no deseados de otros
00:30:09
entonces no es lo recomendable
00:30:11
lo recomendable es que en el contexto
00:30:13
en el que tú vas a hacer algo, ahí te hagas tu contexto
00:30:14
de presidencia y ya está, pero bueno
00:30:16
también depende, depende de la situación
00:30:18
pero
00:30:20
lo que la respuesta
00:30:21
de fondo sería, es que esto no es solo una conexión
00:30:25
esto es una conexión más
00:30:27
un montón de información, de objetos, de cosas
00:30:29
entonces hacerla grande y que
00:30:31
entre ahí todo, puede ser peligroso
00:30:33
tan pequeña como para el método
00:30:35
de DAO, pues a lo mejor no es necesario
00:30:37
a nivel de servicio, vale
00:30:38
pues quizá un poco más
00:30:41
se puede jugar con eso también
00:30:42
dependiendo de la aplicación
00:30:45
entonces, aquí
00:30:46
vale
00:30:48
entonces, el create
00:31:12
sería esto, ya está
00:31:13
el recuperar
00:31:16
este ya no es tan sencillo
00:31:18
el recuperar
00:31:21
este tendríamos que hacer
00:31:23
pues esto mismo de aquí
00:31:24
bueno, a ver, perdonadme, la transacción no la he puesto aquí
00:31:25
que transacción
00:31:39
siempre me olvido de esta
00:31:43
entonces
00:31:44
si podríamos haberle
00:31:56
inyectado por constructor este
00:32:00
y haberlo pasado
00:32:02
a nivel de servicio
00:32:04
del entity manager que fuera uno por servicio
00:32:06
y no uno por método
00:32:08
atómico, pero bueno, son cosas que se pueden
00:32:10
son cosas que se pueden ir
00:32:12
diferentes posibilidades
00:32:14
vale, a ver, entonces este
00:32:16
tiene ahora ya, aquí no sería necesaria una
00:32:18
transacción, aquí no es necesaria
00:32:20
aunque bueno, la podamos poner
00:32:22
porque esto es recuperar, entonces aquí
00:32:24
uno haría el find
00:32:26
y como es el find
00:32:27
para recuperar por clave, que me devolvería
00:32:29
el objeto, este de aquí, verdad
00:32:32
t object
00:32:34
igual a n.find
00:32:37
y aquí yo devolvería el object
00:32:40
pero aquí tengo un problema
00:32:43
y es que
00:32:47
no sé la clase
00:32:49
ojalá
00:32:52
ojalá me dejaran poner esto
00:32:54
pero esto no lo puedo poner
00:32:56
esto no me dejan ponerlo
00:32:58
entonces
00:33:00
se la tengo que pasar
00:33:02
por parámetro
00:33:05
al dado, este de aquí
00:33:07
a ver, ¿qué es? cuando nosotros hablamos
00:33:08
en general, por si
00:33:11
ay Dios mío, tantos
00:33:13
papeles
00:33:15
aquí, pero esto no salió
00:33:16
vale, a ver
00:33:19
cuando nosotros, ¿qué es esto del punto
00:33:21
class? vamos a recordarlo
00:33:23
o verlo por si en ningún momento ha salido
00:33:25
ni lo sabemos, a veces hablamos
00:33:27
alegremente, pues eso
00:33:29
y hacemos, empleado.class
00:33:30
¿Por qué? Porque nos lo han pedido, porque lo necesita algún método. Muchas veces, por ejemplo, este lo necesitaba y hay otros métodos que necesitan que le pasemos esto.
00:33:35
¿Esto realmente qué es? Esto realmente es un objeto. Eso es empleado.class o departamento.class o alumno.class. Esto es un objeto, como todos los objetos de Java, un objeto en memoria, un objeto instanciado y creado en memoria.
00:33:48
por eso lo pasamos por parámetros
00:34:05
porque eso es lo que se pasa por parámetros
00:34:07
objetos de memoria, datos de memoria
00:34:09
es un objeto, y la pregunta sería
00:34:11
¿y qué tiene dentro ese objeto?
00:34:13
¿qué tiene el objeto empleado.class?
00:34:15
tiene información
00:34:18
sobre de qué va
00:34:19
esta clase, como su nombre
00:34:21
número de propiedades que tiene, cosas así
00:34:23
muy random
00:34:25
eso es lo que tiene ese objeto
00:34:26
información sobre esa clase
00:34:29
entonces, hay métodos
00:34:31
que la necesitan. El find
00:34:33
la necesita para
00:34:35
saber de qué va esta clase
00:34:37
para alojar en ella
00:34:39
los resultados del select.
00:34:40
Y muchos otros métodos la necesitan.
00:34:43
Vale, pues
00:34:47
entonces, siguiente pregunta. Si esto es un
00:34:47
objeto, todos los
00:34:49
objetos son de una clase,
00:34:51
¿a qué clase
00:34:54
pertenece este objeto?
00:34:55
Pues a...
00:34:57
¡Qué graciositos! Os quería yo ver aquí
00:35:03
con la pizarra
00:35:06
vale
00:35:08
pues a este
00:35:10
¿qué es esto?
00:35:15
calma, relájate
00:35:23
esto es una clase
00:35:24
esto es una clase
00:35:27
y los objetos
00:35:29
que se instancian
00:35:32
de esta clase, ¿cuáles son?
00:35:34
estos, este es el objeto
00:35:35
que se instancia de esta clase
00:35:37
luego yo puedo hacer
00:35:40
clase, imaginaos que tengo alumno
00:35:41
c igual a
00:35:43
alumno.class
00:35:48
¿vale?
00:35:51
esta asignación es perfectamente válida
00:35:53
el objeto alumno.class
00:35:55
que es el objeto que tiene la información
00:35:57
de la clase alumno
00:35:59
se lo asigno a un objeto
00:36:00
de esta clase
00:36:02
porque esto ya es una clase, esto no es un objeto
00:36:04
¿vale? clase alumno
00:36:07
vale, pues aquí podemos
00:36:09
aprovecharnos de esto porque, oye, yo necesito
00:36:11
un objeto de qué clase
00:36:13
de la clase, clase T.
00:36:15
Esto sí lo puedo poner.
00:36:18
Esto sí me deja jambo.
00:36:20
Pues voy a pasárselo,
00:36:22
voy a inyectárselo por constructor
00:36:24
y luego se lo doy aquí.
00:36:25
Es decir, ¿cómo hago
00:36:28
este arreglo de aquí?
00:36:29
Ese problemón de ahí.
00:36:31
Pues, dime.
00:36:33
¿Y alumno.class se puede guardar
00:36:34
en vez de class de alumno?
00:36:36
¿Se puede guardar directamente en alumno?
00:36:38
No, no, no, porque no es un objeto
00:36:41
alumno. En alumno se lo puedes
00:36:42
guardar objetos alumnos y los objetos alumnos pertenecen a la clase alumno y no pertenecen
00:36:44
a la clase alumno. Eso es otro tipo de objetos, son otro tipo de objetos. Una cosa es el objeto
00:36:49
que guarda información sobre la clase y otra cosa es el objeto que guarda un ejemplo concreto
00:36:55
de esa clase, un alumno en concreto. Vale, pues aquí lo que queremos es pasarle a este,
00:37:01
le queremos pasar
00:37:07
un
00:37:09
esto de aquí
00:37:11
le queremos pasar este objeto
00:37:13
yo que sé, tipo, como lo queráis llamar
00:37:18
esto le queremos
00:37:24
pasar
00:37:26
vamos a pasárselo por constructor
00:37:26
cuando lo llamemos
00:37:29
cuando instanciemos esto
00:37:30
vale, pues a ver
00:37:34
aquí haremos nuestro constructor
00:37:36
de esta de aquí
00:37:39
Y el constructor
00:37:41
No tenía los genéricos, ¿no?
00:37:55
Creo que ahora se los quito
00:37:57
Le pasamos aquí un class de t
00:37:58
Ahora se los quito
00:38:01
Dis
00:38:03
Punto tipo
00:38:10
Igual a tipo
00:38:12
Vale
00:38:14
Y esto de aquí me sobra
00:38:16
¿Verdad?
00:38:19
¡Hala! Ya está
00:38:22
Entonces cuando yo instancia este
00:38:23
Lo instanciaré como departamento íntegre
00:38:25
o empleado íntegre, ¿vale?
00:38:28
Así lo instanciaré.
00:38:31
Y lo instanciaré pasándole al constructor departamento.class
00:38:32
o empleado.class.
00:38:35
Y ya está.
00:38:37
Ahora lo instanciamos.
00:38:38
Con lo cual ya he solucionado el problema de abajo.
00:38:39
Ahora ya aquí le pongo tipo.
00:38:42
Y tan a gusto.
00:38:47
Qué guay.
00:38:49
¿Vale?
00:38:52
Vale, ya tenemos el punto class que sea,
00:38:55
que lo hemos cogido de aquí,
00:38:57
porque se lo vamos a pasar a este cuando lo inyectemos.
00:38:59
aquí quizá, efectivamente como decías tú
00:39:02
también habría sido casi mejor
00:39:05
pasarle
00:39:07
el manager
00:39:08
pasarle un manager
00:39:10
y tirar de él y no estarlo aquí creando
00:39:13
todo el rato, y que luego el que lo cree
00:39:15
sea el servicio, el método de servicio
00:39:17
que lo cree, que no sea uno global de aplicación
00:39:19
sino uno por caso de uso
00:39:21
eso quizá es menos
00:39:22
pesado que
00:39:25
y no solo eso
00:39:25
sino que tendríamos el problema de que aquí
00:39:28
como cerramos la sesión cada vez
00:39:30
cuando yo haga un get
00:39:33
si lo tengo como lazy
00:39:34
aquí habré cerrado la sesión
00:39:37
entonces después de hacer el get
00:39:39
como quiera desde el servicio
00:39:41
sacar los que cuelgan, no los voy a poder sacar
00:39:42
entonces
00:39:45
esto de, estoy pensando yo
00:39:46
que poner aquí el entity manager aquí
00:39:49
nos puede
00:39:50
complicar la vida
00:39:53
si queremos tirar
00:39:54
de los objetos que cuelgan
00:39:56
de este
00:39:58
teniéndolo como lazy
00:40:00
entonces vamos a hacer una cosa más
00:40:02
bonita que es pasárselo por aquí
00:40:04
entonces vamos a pasarle el entity manager
00:40:06
por aquí, por constructor
00:40:08
y al pasárselo por
00:40:10
constructor todo esto se va
00:40:16
a la basura
00:40:18
esto perdón se va a la basura
00:40:19
y el close también
00:40:22
porque si
00:40:23
y aquí tengo que poner lógicamente
00:40:24
la propiedad
00:40:29
y aquí
00:40:36
Dis.en
00:40:37
Igual a en
00:40:41
Así mejor
00:40:42
Se lo paso por constructor
00:40:43
Y ya me quito todo esto
00:40:45
De aquí
00:40:48
Vale
00:40:53
Ya tenemos el get
00:40:54
El remove
00:40:56
Pues será
00:40:57
En punto remove
00:41:00
Del objeto
00:41:03
Y ya está
00:41:07
No estoy validando nada
00:41:11
El en punto remove
00:41:12
me devuelve
00:41:13
un valor
00:41:15
¿verdad que sí?
00:41:17
el remove, ah no, también está hecho
00:41:19
como void aquí, pues entonces
00:41:21
malamente puedo usarlo
00:41:23
vale
00:41:26
te avisará por excepción
00:41:26
si hay algún problema
00:41:28
y ahora
00:41:30
el update como tal es raro
00:41:31
porque en realidad update como tal no existe
00:41:34
tú cambias el objeto, haces con él lo que quieras
00:41:37
y cuando según vayas
00:41:39
haciendo los commit, ya se actualiza
00:41:41
entonces el update como tal es raro
00:41:43
pero se suele usar el método merge
00:41:45
merge
00:41:47
como el equivalente a actualizar
00:41:47
porque con ese obligas
00:41:51
al objeto a que se actualice también
00:41:53
entonces, aquí
00:41:55
podríamos hacer en punto
00:41:58
merge object
00:42:01
pero el
00:42:03
update del
00:42:05
dao es raro
00:42:07
Sí, es que siempre se me olvida
00:42:07
Y aquí también
00:42:13
Y ahí también
00:42:13
Ya estamos con esto
00:42:14
Jolín, comid
00:42:24
Leches
00:42:36
Me estáis poniendo muy nerviosa
00:42:37
Da igual
00:42:44
Me ponéis nerviosa
00:42:46
Con vuestra sola presencia
00:42:47
Da lo mismo
00:42:49
Por favor
00:42:52
¿No sabéis desaparecer así automáticamente?
00:43:00
A veces te vendría muy bien, ¿verdad?
00:43:07
No, a veces te vendría bien a ti
00:43:12
en situaciones en las cuales no te apetece estar
00:43:14
En la mayoría, el 90%
00:43:16
Vale, pues entonces
00:43:19
ahora
00:43:22
yo sintiéndolo muchísimo
00:43:24
muchísimo
00:43:26
no, no, no, está estupendo
00:43:27
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Segundo Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 11
- Fecha:
- 19 de enero de 2026 - 12:03
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 43′ 31″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 189.15 MBytes