20260226 Repaso_3 - 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:
Vale, pues entonces
00:00:00
¿Qué?
00:00:01
Esta va a ser muy cortita, tenía que haber pausado
00:00:05
Y se me ha olvidado
00:00:07
Vale, pues ya está, y nos hicimos este
00:00:08
Que nos creaba
00:00:11
El entity manager
00:00:16
Y ya está, ¿vale?
00:00:17
El entity manager no es el singleton
00:00:19
Es aparece y desaparece, el que lo es es este
00:00:21
Este sí
00:00:23
El factor
00:00:25
Vale, pues ya está
00:00:27
Entonces, nuestro JPA utilera este y ahora, ahora aquí la importancia está en dos sitios, en el modelo y en el DAO, porque ahí tenemos que hacerlo nosotros, no nos lo da Spring, ¿vale?
00:00:28
entonces, en el modelo
00:00:50
pues el modelo ya bien hecho, vamos a revisarlo
00:00:53
porque con este revisamos más o menos todas las
00:00:55
anotaciones que hemos visto
00:00:57
la entidad sede
00:00:58
pues bueno, la entidad sede
00:01:00
estas
00:01:03
anotaciones, no las sabemos de memoria
00:01:05
¿vale? una por tabla
00:01:06
las sabemos de memoria
00:01:09
clave primaria
00:01:10
clave primaria id
00:01:11
si es autoincrement
00:01:13
y si hay algún cambio que queramos
00:01:16
modificar, si hay algún cambio que queramos
00:01:18
modificar en esa propiedad
00:01:20
o columna, anotación
00:01:23
column, en este caso
00:01:24
el nombre porque en SQL
00:01:27
se estilan mucho las barras
00:01:28
bajas y en Java no, entonces
00:01:30
pues ahí
00:01:32
vale
00:01:33
esto lo mismo, column
00:01:36
claro, si puede ser nulo o no puede ser
00:01:38
nul, pero bueno, estas cosas están así
00:01:45
puestas porque
00:01:47
que es la que te ofrece esa cacha GPT y al no quitarlas,
00:01:48
es interesante así que las veamos, ¿vale?
00:01:54
Esto lo podríamos quitar directamente, no os da igual.
00:01:56
El tamaño, claro, el tamaño que fija para la columna.
00:02:00
Vale, ahora ya sí, la sede tiene, ¿vale?
00:02:03
La sede tiene un montón de departamentos gracias a esta clave ajena.
00:02:08
Entonces, al tener un montón de departamentos,
00:02:12
una sede, muchos departamentos,
00:02:14
aquí es donde tendremos
00:02:16
una lista
00:02:18
o conjunto de proyectos
00:02:21
¿por qué lo he cambiado
00:02:23
yo a conjuntos? luego lo vamos a entender
00:02:25
porque lo he cambiado a conjuntos
00:02:27
¿vale? pero podría ser una lista
00:02:29
da igual
00:02:31
entonces, como esto viene
00:02:31
de que hay una clave ajena de departamento
00:02:35
a sede, pues one to many
00:02:37
¿dónde se indica el
00:02:38
campo
00:02:41
que
00:02:41
representa la clave ajena?
00:02:43
se indica en la entidad correspondiente a la tabla donde está la clave ajena.
00:02:46
En este caso es, estoy aquí arriba, perdón, estoy aquí, es en departamento donde está la clave ajena.
00:02:52
Pues entonces decimos, oye, cuidado, que el campo columna que es la clave ajena de la que tienes que tirar
00:03:00
se mapea en la propiedad sede de la clase departamento, que es donde se tiene que mapear,
00:03:07
en la propietaria de la relación
00:03:14
en la entidad
00:03:17
a partir de la cual se pueden hacer modificaciones
00:03:19
etcétera, y ya está
00:03:21
esto era el one to many
00:03:23
claro, esto significa que
00:03:24
automáticamente en la clase de departamento
00:03:29
tiene que haber una propiedad
00:03:31
sede, tiene que haberla
00:03:33
y ahí tiene que estar especificada la clave
00:03:34
ajena, la hay, vamos a ver
00:03:37
pues
00:03:38
si la hay
00:03:40
hay una propiedad sede
00:03:43
en la clase departamento
00:03:46
y justo en ella
00:03:47
se está indicando ahora ya sí
00:03:49
cuál es la clave ajena
00:03:52
mediante el yo en columna, ¿vale?
00:03:53
Aquí es donde se indica.
00:03:55
Es esto, tal cual.
00:03:59
Este nombrecito.
00:04:01
No, este es este.
00:04:07
Este es este.
00:04:09
Este de aquí.
00:04:11
y de sede, la clave ajena
00:04:12
el que solo sede es
00:04:14
claro, el que solo sede
00:04:19
este de aquí
00:04:22
esto es el nombre
00:04:23
de la propiedad
00:04:27
dentro de la clase
00:04:28
esta de aquí
00:04:30
en esta clase tiene que haber una propiedad
00:04:31
con este nombre
00:04:35
vale
00:04:35
vale
00:04:37
vale, entonces cascada
00:04:39
pues ya sabéis que esto
00:04:42
las propiedades estas, pues bueno, estas si que
00:04:44
no es el objetivo
00:04:46
tampoco de nuestra evaluación
00:04:48
el que os hagáis de memoria estas propiedades
00:04:51
pero nos suenan, sabemos lo que significan
00:04:52
entonces como nos suenan
00:04:55
podría ocurrir
00:04:57
que a lo mejor alguna cosa
00:04:59
no esté funcionando como debería
00:05:00
porque a lo mejor alguna de estas cosas
00:05:02
no es como apuestan en el curso de cascada
00:05:04
ya sabéis que significa
00:05:06
cascada que es, cuando yo hago
00:05:08
una operación en sede
00:05:10
si esa operación
00:05:13
se transmite a
00:05:14
departamento o no
00:05:16
aquí como es all, se transmite
00:05:17
todo, si hago un persist
00:05:20
un save, un
00:05:22
remove, se transmite todo
00:05:24
pero entonces
00:05:26
dentro del departamento, dentro del proyecto sede
00:05:27
tiene que haber una variable sede
00:05:30
dentro del departamento tiene que haber una variable
00:05:32
que se llame sede y aquí también
00:05:34
dentro del proyecto sede tiene que haber una que se llame sede
00:05:36
Se va a mapear siempre el extremo de many, es decir, se va a mapear en la entidad correspondiente a la tabla que tenga la clave ajena.
00:05:38
Es decir, aquí es departamento quien tiene la clave ajena y de sede.
00:05:55
Y aquí proyecto sede es quien tiene la clave ajena y de sede a sede.
00:06:00
Con lo cual será en la entidad departamento y en la entidad proyecto sede donde se indica cuál es la columna. Por eso aquí hay un MAPED BY, esto está mapeado en departamento, la propiedad sede. Y aquí hay un MAPED BY, esto está mapeado en proyecto sede, en la propiedad sede. Ahí está.
00:06:05
Claro, pero la propiedad sede tiene su id sede
00:06:26
Entonces, ¿por qué?
00:06:28
La propiedad sede es la propiedad sede
00:06:30
O sea, id sede luego lo tiene
00:06:32
La entidad sede
00:06:33
Proyecto sede tiene su
00:06:35
Proyecto sede
00:06:40
Tiene su propiedad
00:06:41
Sede, que es
00:06:44
Esta
00:06:46
Tiene su propiedad sede que te dice
00:06:47
La clave ajena, ¿cuál es?
00:06:50
Tiene ahí
00:06:54
¿Vale? Ahora vamos
00:06:54
¿Vale? Si esto al final son cuatro
00:06:58
cosas, son cuatro cosas y lo mismo
00:07:00
todo el rato
00:07:02
no, porque
00:07:03
es que no tenemos
00:07:08
tiempo, pero
00:07:10
vale, pero el
00:07:11
claro, pero
00:07:14
bueno, ahora cuando lleguemos al
00:07:16
claro, porque
00:07:18
hay una entidad intermedia
00:07:20
pero podría no haberla, ahora cuando vayamos a ella
00:07:22
mencionamos ese caso, vale
00:07:24
no, no, no
00:07:26
porque no hemos hecho ningún ejemplo por falta
00:07:28
de tiempo, lo ideal habría sido que
00:07:30
tuviéramos tenido tiempo para hacer
00:07:32
muchos ejemplos con diferentes bases de datos
00:07:34
diferentes tablas, diferentes cosas
00:07:36
pero bueno, sabéis de que va el rollo y ya está
00:07:38
ahora de todas formas mencionamos
00:07:40
como sería ese caso cuando
00:07:42
estemos ya en proyecto sede, entonces
00:07:44
las anotaciones de sede
00:07:46
pues están claras, el one to many
00:07:48
porque lo hemos puesto aquí
00:07:50
y las propiedades que tiene
00:07:51
este era, oye
00:07:53
que pasa si se queda
00:07:56
alguno de estos
00:07:58
si alguno de estos objetos
00:08:00
departamentos resulta
00:08:02
que ha perdido la sede a la que
00:08:05
pertenece, porque esa sede
00:08:06
ha dejado de ser persistente, ¿qué pasa
00:08:08
con ese departamento? Pues el
00:08:10
true significa fuera al departamento.
00:08:12
¿Vale?
00:08:15
Se elimina.
00:08:16
Pero el cascade, si tú haces específicamente
00:08:19
un remove al departamento,
00:08:22
pero el departamento puede haber desaparecido
00:08:25
por otras razones.
00:08:26
Puede haber
00:08:29
O sea, perdón, la sede
00:08:29
Claro, la sede puede haber desaparecido
00:08:32
De la aplicación por otras razones
00:08:36
Puede haberse quedado sin referencia
00:08:37
Por otras cosas propias de Java
00:08:39
Que no sean específicamente por hacer
00:08:40
Una sentencia con el entity manager
00:08:43
O sea, el cascade significa
00:08:45
Cómo se
00:08:47
Si tú haces un
00:08:48
Si el entity manager hace una sentencia
00:08:50
Sobre la sede
00:08:53
Si esa misma sentencia se traslada al departamento
00:08:54
si es la misma sentencia
00:08:57
y Orphan Removal
00:08:59
en particular en remove
00:09:01
si tú haces remove de la sede
00:09:02
se hace en remove del departamento
00:09:04
y esto es algo más amplio
00:09:06
es decir, si la sede ha desaparecido
00:09:08
por la razón que sea
00:09:10
por razones de Java
00:09:12
no tiene que ser porque el entity manager la haya hecho
00:09:14
pues si ha desaparecido, ¿qué pasa con el departamento?
00:09:16
que se ha quedado ahí
00:09:19
por ejemplo, el cascabel puede ser
00:09:20
que si
00:09:22
tú cambias el ID de la sede
00:09:23
ese cambio en todos los abanicos
00:09:26
tú nunca cambiarías una idea de una sede
00:09:27
jamás
00:09:30
por ejemplo poner un mes así
00:09:31
pues un ejemplo horrible
00:09:33
nunca toques claves primarias, por dios
00:09:35
nunca
00:09:37
pues cambias una
00:09:38
segundo de la sede
00:09:40
no, si no, a ver no
00:09:44
si tú cambias algo de la sede, cambia algo de la sede
00:09:46
vamos a, si tú eliminas
00:09:48
la sede, pues eliminas todos los departamentos
00:09:50
que cuelgan de ella
00:09:52
haces persistente una sede, pues haces
00:09:53
persistente también en todos los departamentos
00:09:56
que colgan de ella, eso es lo que significa
00:09:58
pero bueno, no te enredes mucho en ello tampoco
00:10:00
pero, pero entendida
00:10:01
la idea, ¿no?
00:10:04
vale, pues estas
00:10:09
dos estarían y ya no hay más anotaciones en sede
00:10:11
entonces vamos a las
00:10:13
otras sencillitas que serían
00:10:14
departamento lo mismo, no tiene
00:10:16
nada distinto, clave
00:10:18
primaria, entonces
00:10:20
departamento es el otro extremo de la sede
00:10:22
por eso tiene el many to one
00:10:25
¿vale? entonces como tiene el many to one
00:10:26
el many to one tiene que tener
00:10:28
ahí así el join column
00:10:30
que diga cuál es el campo de la tabla
00:10:31
que ejerce de clave ajena
00:10:34
¿vale?
00:10:35
que si
00:10:39
un many to one es el extremo
00:10:40
de un one to many
00:10:42
entonces
00:10:43
aquí sí que tiene
00:10:45
que acompañar ya la información
00:10:48
de cuál es el campo clave ajena
00:10:50
de la tabla
00:10:52
no, no, lo puedes poner en el getter
00:10:53
Todo esto lo puedes poner en el getter
00:10:58
¿Vale?
00:11:00
Sí, lo puedes poner en el getter
00:11:01
Vale
00:11:04
Entonces aquí ese es el campo clave ajena
00:11:05
Y luego está
00:11:08
La que sí que
00:11:09
Tiene un poco más de trascendencia
00:11:11
Y nos hemos enfrentado un poquito más a ella
00:11:14
Siempre que tenemos
00:11:16
Un objeto o una colección
00:11:18
Que se carga a través de un join
00:11:20
Que esta se va a cargar a través de un join
00:11:22
Porque viene con una clave ajena
00:11:25
Pues o lazy o eager
00:11:26
¿Dejamos la opción por defecto?
00:11:28
Pues en esta por defecto es el líder
00:11:31
Cuando tenemos una colección
00:11:33
Por defecto es Lazy
00:11:36
¿Vale?
00:11:37
¿Que queremos ponerla específica Lazy?
00:11:38
Pues lo ponemos, que no nada
00:11:41
Aquí por ejemplo en sede
00:11:42
No se la hemos puesto
00:11:44
Porque por defecto ya es Lazy, ¿verdad?
00:11:46
Sí, un HASHET
00:11:53
¿Vale? Que he implementado ya
00:11:55
He implementado ya, podrían haberlo puesto
00:11:56
Y no pasa nada, todo funciona
00:11:59
pero bueno, lo he puesto
00:12:00
para asegurarme
00:12:02
de que no va a haber null pointer exception extraños
00:12:04
por ahí
00:12:06
pero claro, todo tiene su precio
00:12:06
en realidad, todo tiene su coste
00:12:10
por la tranquilidad
00:12:12
de no haber un null pointer exception
00:12:14
pero ¿qué coste?
00:12:15
comprometer la implementación
00:12:18
¿vale? comprometerla
00:12:20
¿vela? vale
00:12:22
cuando es una colección entonces
00:12:23
por efecto es lazy
00:12:25
cuando es una colección por efecto es lazy
00:12:26
Cuando es un único objeto, porque es el many to one, por defecto es eager, ¿vale?
00:12:29
Bueno, pues entonces departamento, pues estas de aquí, que no tienen nada.
00:12:34
Departamento a su vez tiene lista de empleados, one to many, todo igual, ya está.
00:12:38
Aquí empleado.
00:12:43
Empleado, pues nada, empleado no tiene nada.
00:12:46
Muchos departamentos, perdón, un empleado, un departamento, por eso este es el extremo many to one,
00:12:50
con la columna y de departamento, esta no tiene nada raro
00:12:57
y ahora ya la relación esta, que esta es la más rara
00:13:00
de mapear, la relación de muchos a muchos
00:13:05
que es esta de aquí, la relación de muchos
00:13:09
a muchos es la de estas tres tablas, ¿vale?
00:13:13
Entonces, la relación de muchos a muchos
00:13:18
en SQL ya sabéis que es a través
00:13:21
de una tabla aparte
00:13:25
pero puede ocurrir
00:13:27
que no haya información
00:13:29
más allá de la relación
00:13:31
que no la haya
00:13:33
no es el caso de este
00:13:34
entonces
00:13:37
cuando no es el caso
00:13:39
es decir, cuando sí que hay
00:13:41
cuando sí que hay
00:13:43
propiedades
00:13:45
que caracterizan a la relación
00:13:47
en sí
00:13:49
necesitamos una entidad específica
00:13:50
para esta tabla
00:13:53
porque en esa entidad es donde irán
00:13:54
estas propiedades, necesitamos una entidad específica
00:13:56
¿vale? que es el modelo que está aquí
00:13:59
ahora miramos un poquito
00:14:01
pues como sería si no
00:14:02
tuviéramos esto, que se simplifica mucho el modelo
00:14:04
se simplifica mucho, que es el many to many
00:14:06
que dices tú, vale
00:14:08
pues entonces, al haber una entidad
00:14:10
intermedia, ese many to many
00:14:12
en realidad se ha convertido
00:14:15
en dos one to many
00:14:16
¿vale? dos one to many
00:14:17
que... claro, entonces
00:14:20
Entonces vemos esta situación, pues tiene que haber una entidad proyecto sede, entonces proyecto sede que tiene dos claves, una clave primaria compuesta, entonces proyecto sede es esta.
00:14:23
entonces proyecto sede
00:14:41
tiene
00:14:43
un proyecto por un lado
00:14:45
y otra sede por otro
00:14:48
que son los extremos
00:14:50
many to one
00:14:52
de las dos relaciones
00:14:53
de uno a muchos
00:14:56
de las dos relaciones de uno a muchos
00:14:57
los extremos many to one
00:14:59
al ser los extremos many to one
00:15:00
de esa relación tienen que tener la columna
00:15:04
que los une
00:15:06
que está clara y de prot y de sede
00:15:07
que sería esta, y de proyecto y de sede, estos dos, pues son estos dos de aquí, este y este, vale, entonces, esto lo dejamos aparcado, ahora un momentito, este MAPSID y este MAPSID, pero las dos primeras líneas estarían claras, vale,
00:15:10
toda entidad
00:15:30
JPA tiene que tener una clave primaria
00:15:33
sí o sí obligatoria
00:15:35
bueno, pues en realidad
00:15:37
podríamos, opción sencilla
00:15:39
pero que en
00:15:41
proyectos muy complicados con muchas cosas
00:15:43
que le haces, puede acabar
00:15:45
dando terrores e historias chungas
00:15:47
pero se podría, y en la mayoría
00:15:49
de los contextos funciona
00:15:51
pasar de esto
00:15:52
ID e ID
00:15:54
y tirando, y ya está y no pasa nada
00:15:56
A JPA, de hecho lo hemos hecho así
00:15:59
¿Vale? Y a JPA
00:16:01
Pues le parece estupendo
00:16:02
Bueno, no sé lo que le parece
00:16:05
Porque no es humano por ahora
00:16:06
Pero ya está, tiras
00:16:08
La mayoría de los casos tira
00:16:10
¿Vale? Pero
00:16:11
No, no tiene nada que ver con eso
00:16:13
Pero
00:16:17
Es mucho más recomendable
00:16:18
Que la clave primaria esté en un único campo
00:16:21
¿Vale? Para asegurar el manejo
00:16:23
De esas entidades
00:16:25
No a través de dos propiedades
00:16:26
A través solo de una
00:16:28
Para ciertas situaciones
00:16:29
De hecho, te puede dar hasta error
00:16:30
Bueno, pues si queremos que la clave primaria
00:16:33
Esté en un solo campo
00:16:35
Vamos a hacer una ID
00:16:36
¿De qué tipo?
00:16:38
Tiene que tener dos cosas
00:16:39
Pues no me queda más remedio
00:16:40
Que hacer una clase aparte
00:16:41
Para que tenga esas dos cosas
00:16:42
Vale, pues entonces
00:16:43
Este es un tipo clave
00:16:45
Que nos tenemos que hacer
00:16:47
No nos queda más remedio que hacerlo
00:16:48
Un tipo clave que nos tenemos que hacer
00:16:50
Porque contiene dos cosas
00:16:51
Pues ese tipo clave sería este
00:16:52
y este tipo clave tiene
00:16:55
su
00:16:57
y de proyecto
00:16:58
las dos claves, los dos enteros
00:17:00
este y este, que hay que decirle
00:17:03
como he cambiado el nombre
00:17:05
hay que ponérselo aquí porque he cambiado el nombre
00:17:06
si no este column no haría ni falta
00:17:09
¿vale? entonces un segundinín
00:17:11
este tipo clave
00:17:13
no necesita anotarle nada más
00:17:14
ni hacerle nada más
00:17:17
pero resulta que como este tipo clave
00:17:18
va a formar, va a ser
00:17:21
la clave primaria de otra
00:17:23
entidad
00:17:25
para que JPA lo entienda
00:17:26
hay que poner esta
00:17:29
anotación, ya está, aunque nos quedemos con eso
00:17:31
suficiente, hay que poner esta
00:17:33
anotación, pues se planta esta anotación
00:17:35
y ahora en proyecto sede
00:17:37
yo digo, ojo
00:17:39
que esta es de una entidad
00:17:40
embedable, es una clave primaria
00:17:43
embebida, aquí metida
00:17:45
en todo esto, vale
00:17:47
y ahora vamos con esto
00:17:48
dime
00:17:50
¿Por qué le pones luego también
00:17:52
id proyecto y id sea a la otra clase
00:18:08
si ya lo tienes dentro de la id?
00:18:09
No se lo he puesto, le he puesto el propio objeto
00:18:12
Claro, le he puesto el objeto para que tenga
00:18:14
todos los datos, esto es para poner una clave
00:18:16
Es que
00:18:18
donde tienen que estar los objetos
00:18:20
por pura semántica es aquí, en la relación proyecto-sede
00:18:23
tienen que estar aquí, entonces esto es solo para la clave
00:18:27
entonces la clave en cualquier otra entidad
00:18:30
siempre es el tipo de dato, ¿qué es un entero?
00:18:33
pues es un entero, es decir, tú aquí en id-sede no te has planteado
00:18:36
decir esto que sea de tipo sede
00:18:39
tú ahí tienes la información de la clave porque tiras de ella para búsquedas
00:18:41
para lo que sea, pues aquí igual
00:18:45
proyecto sede
00:18:47
esta es
00:18:49
la clave, entonces tú quieres los valores
00:18:51
de la clave, no pienses que como son dos
00:18:53
los hemos metido en otro sitio, pero tienen que ser
00:18:56
los propios valores de la clave, luego ya los datos
00:18:58
los datos ya van ahí
00:19:00
los datos ya van ahí
00:19:01
y luego también
00:19:02
hace falta un hipo, es un fast food
00:19:05
porque no hay hipo
00:19:07
claro, pero porque he puesto sets
00:19:09
he hecho que las colecciones
00:19:11
fueran hard set
00:19:14
la clase de líder
00:19:14
Ah
00:19:16
En la clase del ID
00:19:17
Por amas ID sería
00:19:19
Yo lo pongo
00:19:23
¿Dónde está?
00:19:31
Aquí está
00:19:32
Siempre es recomendable
00:19:32
En cualquier entidad ponerlo
00:19:36
Los dos, jasco de equals
00:19:38
Porque es que si no nunca sabes
00:19:40
Cuando va a petar por ahí
00:19:42
¿Y en proyectos?
00:19:43
En proyecto sede tengo, claro, de la ID.
00:19:44
Todos por clave primaria.
00:19:53
¿Vale?
00:19:54
Bueno, esto en cuanto a la clave.
00:19:58
Y ahora, nosotros ya podríamos tirar con esto.
00:20:02
Imaginaos que nos olvidamos de este maps ID.
00:20:06
O sea, lo de que la clave sean dos parámetros.
00:20:09
Por tanto, sea un tipo que nos hemos hecho nuevo.
00:20:12
que ese tipo tenga que tener el
00:20:14
embedable y aquí decirle que es en bebidas
00:20:16
o ya está, es que es eso, es sota caballo y rey
00:20:18
ya está, no hace falta saber más que eso
00:20:20
ahora, lo único es que aquí
00:20:21
JPA
00:20:24
luego se puede volver un poco loco
00:20:25
si no ponemos este mapsid
00:20:28
si no ponemos este mapsid
00:20:30
pero porque se vuelve un poco loco
00:20:34
porque ve que tiene
00:20:36
una información en dos sitios, duplicada
00:20:38
ve que tiene aquí
00:20:40
y de proyecto
00:20:42
ID sede y luego la tiene
00:20:44
aquí dentro también
00:20:46
entonces
00:20:47
para decirle
00:20:49
a JPA, son siempre la misma
00:20:52
cuidado, no te estoy dando la clave
00:20:54
primaria dos veces
00:20:56
aunque tengas dos ID pro
00:20:57
son el mismo, no te líes
00:21:00
le ponemos el maps, que le decimos
00:21:02
oye, esta sede
00:21:04
de aquí, su ID de sede
00:21:05
no es un ID de sede que
00:21:08
pueda ser otro diferente a este
00:21:10
que pueda ser otro
00:21:12
es como si tuviera dos referencias
00:21:13
que se llamaran IDS
00:21:15
JPA dice
00:21:17
tengo dos cosas que se llaman IDS
00:21:18
lo que está aquí dentro
00:21:21
y lo que está aquí dentro
00:21:22
y tengo dos cosas que se llaman IDPROJ
00:21:24
el que está aquí dentro y el que está aquí dentro
00:21:26
entonces
00:21:29
pues
00:21:31
dos cosas que se llaman igual
00:21:32
no me mola, no me gusta
00:21:34
entonces
00:21:37
si no le ponemos esto
00:21:38
nos peta y le decimos
00:21:40
Cuidado que están perfectamente conectados
00:21:42
Este idprox
00:21:45
Arrastra siempre
00:21:46
Al de aquí
00:21:48
Y este idcd arrastra siempre
00:21:49
Al de ahí, ya está
00:21:52
Con esas notaciones estaríamos
00:21:53
Si arrastra al de ahí
00:21:55
¿Por qué lo llamo idcd en el map?
00:21:57
Porque se llama idcd aquí
00:22:00
Ahí
00:22:03
Exacto
00:22:04
¿Y te lo mapea con el
00:22:08
No te entiendo
00:22:10
Sí, lo que le estoy diciendo
00:22:21
Es que esta ID de aquí
00:22:25
O sea, la ID de aquí
00:22:27
Es el mismo campo
00:22:29
ID prot que está aquí dentro
00:22:32
Que se refiere al mismo
00:22:33
Bueno, no te lo sobreentiendes
00:22:35
Si tú no le pones
00:22:40
o sea, en el momento
00:22:41
de hacer un get proyecto sede
00:22:44
sí, en el momento de hacer un get
00:22:46
proyecto sede, de hacer
00:22:48
un get con JPA
00:22:50
él al hacer el get ya te lo mapea y te lo hace todo
00:22:51
pero luego, pero ¿cuál es el
00:22:54
problema? que ese objeto se queda con
00:22:56
una información en dos sitios
00:22:58
guardada, una vez que ya está
00:23:00
mapeado, el problema no es hacer el get, ahí no hay
00:23:02
problema, el problema es que él se queda con la
00:23:04
información guardada en dos sitios, la misma
00:23:06
aquí dentro y aquí dentro
00:23:08
entonces le indicamos
00:23:10
que esa es la misma, nos referimos a la misma
00:23:12
que no tiene dos propiedades idprox
00:23:14
nos referimos a eso simplemente
00:23:16
porque te obliga
00:23:18
si es que no sé mucho más que esto que te estoy diciendo
00:23:20
claro, tú al poner aquí
00:23:22
maps id, él dice
00:23:38
ah, vale, que esto en la clave
00:23:40
también lo tengo, y ah, que lo tengo
00:23:42
duplicado, dice, ah, vale
00:23:44
o sea, que esta es una dúplica
00:23:46
y se va a la clave y dice, ¿es una dúplica de quién?
00:23:47
de este
00:23:50
¿vale?
00:23:50
el error sería, o sea
00:23:53
la idea del error es como si tú declaras
00:23:56
una variable dos veces, si no pones
00:23:58
maps id, sería como declarar
00:24:00
algo dos veces, que Java no te deja
00:24:02
¿vale? pues es la idea
00:24:04
vale, entonces, ahora, antes
00:24:05
de irnos al recreo
00:24:08
¿qué ocurriría
00:24:09
si aquí,
00:24:11
esperemos,
00:24:15
dime,
00:24:16
sobre el código este?
00:24:16
Sí.
00:24:21
Ah, ahora cuando paremos, ¿vale?
00:24:24
Digo esto y, vale.
00:24:26
Entonces, ¿qué ocurre
00:24:28
si esto no tiene estas dos
00:24:30
de aquí?
00:24:32
Si no tiene estas dos, ¿vale?
00:24:34
No hace falta proyecto
00:24:36
No hace falta. El modelo sería más fácil. Sede tendría list proyecto, punto pelota. Y proyecto tendría list sede, punto pelota. ¿Qué cambian? Las anotaciones. Ahora, en ambas listas, en ambos lados, tendría que haber un many to many en los dos.
00:24:38
many to many, y ahora en uno
00:25:00
de los dos, solo en uno
00:25:02
¿en cuál? en el que queramos
00:25:03
ahí sí que podemos elegir
00:25:06
solo en uno de los dos, ahora ya sí habría
00:25:07
que mapear
00:25:10
cuáles son las dos claves
00:25:10
ajenas
00:25:13
¿vale? entonces quedaría algo como esto
00:25:15
¿la tabla seguirá viendo?
00:25:17
no, esta no, la tabla sí, claro
00:25:19
lo que no existe es la entidad
00:25:21
entonces
00:25:22
nos quedaría
00:25:24
una notación tipo esta
00:25:28
Ejemplo
00:25:29
No, eso no lo voy a poner en el examen
00:25:33
Porque no hemos hecho ningún ejemplo
00:25:34
Joder, mayúsculas no, que se cree que estoy enfadada
00:25:35
Ejemplo
00:25:38
No, no es un tochaco
00:25:40
En realidad son
00:25:46
Yo, el referes y el inverse
00:25:47
Tú tienes que poner dos campos
00:25:50
El inverse y el otro, y ya está
00:25:52
Nada más, y la tabla
00:25:54
Tienes que poner la tabla y las dos columnas
00:25:55
No tienes que poner más
00:25:58
puede ser
00:25:59
pero vale, entonces vámonos directamente a la anotación
00:26:03
vale, ya está, es esta, no tiene más
00:26:06
entonces esto sería, por ejemplo
00:26:09
estudiante cursos, un estudiante muchos cursos
00:26:12
un curso muchos estudiantes, una many to many
00:26:15
entonces, estudiante tendría
00:26:18
¿dónde estamos? estudiante tiene
00:26:21
por tanto muchos cursos
00:26:24
y curso tendría que estar
00:26:26
por abajo muchos estudiantes
00:26:28
entonces la tabla estudiante
00:26:30
la entidad estudiante curso no existe, esa no existe
00:26:32
entonces aquí
00:26:34
anotamos que esto es un
00:26:36
many to many
00:26:38
que es un many to many
00:26:39
y ahora ya hay que decir simplemente
00:26:41
tabla que tiene
00:26:44
la relación, tabla, que la tabla
00:26:46
sí existe lógicamente
00:26:48
y las dos columnas
00:26:49
esta que sería la columna
00:26:51
la que pones aquí
00:26:54
es la columna, la clave ajena
00:26:55
de la tabla en la que estás
00:26:58
de estudiante, ahora estamos en estudiante
00:26:59
y la que pones en inverse
00:27:02
es la clave ajena referencia
00:27:04
al otro extremo, a curso
00:27:06
y ya está, con poner esto
00:27:08
luego tienes más propiedades que podrías poner
00:27:10
de fetch
00:27:12
de no sé qué, pero esto es lo básico
00:27:14
No, no, no, estás haciendo referencia al tuyo, estás estudiante.
00:27:16
Claro, tú eres estudiante, pero es que, sí, pero, a ver, pero estas son de la tabla estudiante-curso,
00:27:31
entonces esta es, yo como estudiante, ¿cuál es la clave ajena en la que me adhiero? A esta, yo en columna.
00:27:39
Pero es que el otro es el otro para los dos
00:27:46
Porque el otro es la tabla estudiante curso
00:27:51
Tienes estudiante, estudiante curso
00:27:54
Y curso
00:27:57
Vale, pues ya está
00:27:58
Claro, esto es de la tabla intermedia
00:28:01
Y ahora, estudiante
00:28:05
Tendrá un Muppet By
00:28:09
Estudiante, que estará por aquí abajo
00:28:10
Many to Many tiene un map
00:28:13
porque esto ya está mapeado
00:28:16
en la propiedad
00:28:18
cursos de la clase estudiante
00:28:20
lo haces en uno de los dos
00:28:22
¿en cuál? en el que quieras
00:28:25
pero eso sí
00:28:26
en el que lo hagas
00:28:27
lo has convertido en propietario
00:28:29
¿qué significa? que en esto que ha hecho
00:28:31
CharGPT, el propietario
00:28:34
es el estudiante
00:28:36
el propietario de la relación, con lo cual el estudiante
00:28:38
a través del estudiante
00:28:40
puedes cambiar los cursos, los datos
00:28:42
de los cursos. Pero a través
00:28:44
de curso no puedes cambiarlos de los estudiantes.
00:28:46
¿Vale? Porque eso sí que tiene trascendencia.
00:28:50
El que tenga el
00:28:52
joint column y todo esto,
00:28:54
en este caso este,
00:28:57
este a partir
00:28:59
de estudiantes, que tú agregas
00:29:00
un curso, lo puedes hacer sin
00:29:02
ningún problema. Que borras un curso,
00:29:04
lo puedes hacer. JPA te lo hace,
00:29:06
porque estás propietario.
00:29:08
Pero, desde aquí,
00:29:10
desde curso
00:29:12
tú no puedes cargarte un estudiante
00:29:14
no puedes añadir estudiantes
00:29:16
a la colección, quitarlos, no puedes
00:29:18
no te deja
00:29:20
bueno, es que no te deja, tú lo haces pero luego ves que no te lo ha hecho
00:29:20
¿vale? porque la que manda
00:29:23
es la otra
00:29:26
que tiene sentido
00:29:26
tiene sentido que un estudiante pueda cambiar
00:29:29
sus cursos, pero tiene todo el sentido
00:29:32
del mundo que a través
00:29:34
de un curso tú no puedas eliminar estudiantes
00:29:36
¿vale? entonces siempre se elige
00:29:38
el propietario con el que
00:29:40
tenga sentido, ¿vale?
00:29:42
No.
00:29:47
Según esto, tú no puedes eliminar
00:29:49
de un curso, no puedes eliminar a un estudiante,
00:29:51
efectivamente. O modificar sus propiedades.
00:29:52
O sea, a través de un curso, esto
00:29:55
sobre todo se ve a través de modificar
00:29:57
por ejemplo, el estudiante tiene una edad.
00:29:59
A través del curso no puedes
00:30:02
cambiar su edad, no te lo va a coger.
00:30:03
Pero el
00:30:05
estudiante tiene un curso.
00:30:06
A través del estudiante puedes cambiar el nombre del curso.
00:30:09
Eso sí podrías, por ejemplo.
00:30:11
Porque el estudiante es el que tiene la propia...
00:30:13
Entonces, a través de aquí tú puedes cambiar de cursos lo que quieras.
00:30:17
Su nombre, lo que te dé la gana.
00:30:21
Pruébalo.
00:30:22
Sí, sí.
00:30:23
Dime.
00:30:27
Justo.
00:30:32
Entonces, no hace falta esa tabla.
00:30:33
Pero si hay propiedades, hace falta, que es lo habitual normalmente.
00:30:36
¿Vale?
00:30:40
Pero bueno, el many-to-many lo vamos a poner en el examen
00:30:41
No, porque lo hemos mencionado ahora
00:30:43
No hemos hecho ningún ejemplo antes
00:30:49
Si lo he dicho antes
00:30:50
Es que no me escucháis, me escucháis como en zig-zag
00:30:53
O sea, una vez de cada 10 minutos
00:30:55
Al igual que tú, que tenemos que decir la que escucha
00:30:56
Exacto
00:30:58
Es que ni un chico se escucha
00:31:00
¿Eh?
00:31:01
Hombre, sí, porque de eso sí que es de lo que hemos visto
00:31:03
Ejemplo, ¿vale?
00:31:06
Vale
00:31:09
Ahora miro lo tuyo, Cristina
00:31:10
Venga, pues paramos aquí
00:31:12
- 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:
- 1
- Fecha:
- 3 de marzo de 2026 - 17:08
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 31′ 15″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 132.71 MBytes