1 00:00:01,010 --> 00:00:19,129 Vale, entonces esto en resumen, las entidades JPA ya en mi modelo Java están relacionadas entre sí porque las entidades tienen objetos de las otras entidades. Esa es la forma en la que se expresa que están relacionadas. 2 00:00:19,129 --> 00:00:23,410 Entonces, cuando ya se cargue el contexto de persistencia 3 00:00:23,410 --> 00:00:24,750 El entity manager que es aquí 4 00:00:24,750 --> 00:00:27,410 Y ya aparezcan nuestros objetos persistentes 5 00:00:27,410 --> 00:00:31,269 Bien, porque los hemos recuperado de la base de datos con un find 6 00:00:31,269 --> 00:00:35,350 O bien, porque los hemos creado nuevos en la aplicación 7 00:00:35,350 --> 00:00:37,390 Como transitorios y hemos hecho el persist 8 00:00:37,390 --> 00:00:38,829 Para que se conecten 9 00:00:38,829 --> 00:00:40,710 Son las dos maneras de tener objetos persistentes 10 00:00:40,710 --> 00:00:43,189 Ya tenemos nuestros objetos persistentes 11 00:00:43,189 --> 00:00:46,189 Ya sabemos que la dinámica en JPA es 12 00:00:46,189 --> 00:00:48,329 Yo ya modifico las propiedades de los objetos 13 00:00:48,329 --> 00:00:51,229 Y con los commits 14 00:00:51,229 --> 00:00:52,990 Esas modificaciones 15 00:00:52,990 --> 00:00:55,130 Se trasladarán a la actualización 16 00:00:55,130 --> 00:00:56,450 De los campos correspondientes 17 00:00:56,450 --> 00:00:57,929 ¿Vale? 18 00:00:58,729 --> 00:00:59,689 Se trasladarán 19 00:00:59,689 --> 00:01:00,850 Aquí en jugador 20 00:01:00,850 --> 00:01:03,850 Si yo cambio el objeto equipo 21 00:01:03,850 --> 00:01:05,409 Si lo cambio 22 00:01:05,409 --> 00:01:08,549 Hago un equipo nuevo 23 00:01:08,549 --> 00:01:10,849 Al jugador le hago set equipo 24 00:01:10,849 --> 00:01:11,670 Ese equipo 25 00:01:11,670 --> 00:01:13,670 Trabajo con los objetos de la base de datos 26 00:01:13,670 --> 00:01:14,890 Ni la miro, me olvido de ella 27 00:01:14,890 --> 00:01:16,689 Pues cuando llegue el commit 28 00:01:16,689 --> 00:01:19,989 automáticamente 29 00:01:19,989 --> 00:01:21,989 ya JPA 30 00:01:21,989 --> 00:01:24,049 se encargará de meter en esta 31 00:01:24,049 --> 00:01:25,489 en este campo 32 00:01:25,489 --> 00:01:28,250 de la tabla jugador 33 00:01:28,250 --> 00:01:30,170 el ID correspondiente al equipo 34 00:01:30,170 --> 00:01:32,189 que tú has puesto como objeto aquí y ya se encarga 35 00:01:32,189 --> 00:01:33,209 de todo eso, ¿verdad? 36 00:01:33,670 --> 00:01:35,989 Esa es la clave de JPA 37 00:01:35,989 --> 00:01:38,209 el truco de JPA, yo tengo objetos persistentes 38 00:01:38,209 --> 00:01:40,129 los toco en Java 39 00:01:40,129 --> 00:01:41,810 los toco cambiando propiedades 40 00:01:41,810 --> 00:01:43,390 moviendo, agregando, quitando 41 00:01:43,390 --> 00:01:46,030 y eso, mágicamente 42 00:01:46,030 --> 00:01:48,629 entre comillas, se va correspondiendo 43 00:01:48,629 --> 00:01:50,049 a la actualización de los campos 44 00:01:50,049 --> 00:01:52,250 de la base de datos, esa es la idea, por eso hacemos esto 45 00:01:52,250 --> 00:01:54,290 y así no tenemos que hacer ni SQL 46 00:01:54,290 --> 00:01:54,890 ni nada de eso 47 00:01:54,890 --> 00:02:02,810 a ver, cuando tú seteas un equipo 48 00:02:02,810 --> 00:02:04,469 ese equipo tendrá un objeto 49 00:02:04,469 --> 00:02:05,189 que tendrá un ID 50 00:02:05,189 --> 00:02:06,629 y ese ID 51 00:02:06,629 --> 00:02:13,969 la primera vez que lo creas 52 00:02:13,969 --> 00:02:14,189 no 53 00:02:14,189 --> 00:02:16,229 entonces aparecerá el ID 54 00:02:16,229 --> 00:02:18,189 solo cuando se haga persistente 55 00:02:18,189 --> 00:02:20,069 ¿vale? entonces para hacerse 56 00:02:20,069 --> 00:02:22,169 persistente este equipo lo tendrías que hacer tú antes 57 00:02:22,169 --> 00:02:24,210 con un persist y luego hacerle el set 58 00:02:24,210 --> 00:02:26,289 equipo, pero después de haber hecho tú 59 00:02:26,289 --> 00:02:28,210 el, creas el equipo persist 60 00:02:28,210 --> 00:02:30,289 a ese equipo ya le aparece 61 00:02:30,289 --> 00:02:32,210 su ID ¿vale? 62 00:02:32,629 --> 00:02:33,189 entonces 63 00:02:33,189 --> 00:02:36,129 cuando luego tú hagas jugador 64 00:02:36,129 --> 00:02:38,729 set equipo ese equipo pues ya automáticamente 65 00:02:38,729 --> 00:02:39,909 JPA 66 00:02:39,909 --> 00:02:41,969 en el campo ID equipo ID 67 00:02:41,969 --> 00:02:43,770 de esa tabla lo pondrá etc 68 00:02:43,770 --> 00:02:45,669 ¿vale? entonces 69 00:02:45,669 --> 00:02:47,310 para ti es transparente ese ID 70 00:02:47,310 --> 00:02:54,090 o también puedes haber cogido el equipo 71 00:02:54,090 --> 00:02:55,930 de la base de datos porque cambias al jugador 72 00:02:55,930 --> 00:02:57,870 de equipo, entonces haces un find, luego lo haces 73 00:02:57,870 --> 00:02:59,610 el set, bueno pues entonces 74 00:02:59,610 --> 00:03:01,909 lo que estaba 75 00:03:01,909 --> 00:03:03,389 diciendo, que en las relaciones 76 00:03:03,389 --> 00:03:06,229 sean de uno a uno 77 00:03:06,229 --> 00:03:08,150 de uno a muchos o de muchos a muchos 78 00:03:08,150 --> 00:03:10,250 para JPA hay uno 79 00:03:10,250 --> 00:03:12,650 que es el que manda, el propietario 80 00:03:12,650 --> 00:03:14,009 y otro 81 00:03:14,009 --> 00:03:15,189 que no es el que manda 82 00:03:15,189 --> 00:03:17,569 entonces el que manda es siempre 83 00:03:17,569 --> 00:03:20,150 el que tiene 84 00:03:20,150 --> 00:03:21,770 el extremo many 85 00:03:21,770 --> 00:03:23,949 ¿vale? el extremo many 86 00:03:23,949 --> 00:03:25,289 el que tiene el extremo many 87 00:03:25,289 --> 00:03:27,669 es el que tiene en la tabla 88 00:03:27,669 --> 00:03:28,490 el campo 89 00:03:28,490 --> 00:03:31,550 jugador es el que tiene en su 90 00:03:31,550 --> 00:03:33,669 tabla el campo, es el que lo tiene 91 00:03:33,669 --> 00:03:35,389 equipo no tiene jugador id 92 00:03:35,389 --> 00:03:37,770 no lo necesita, ese es el que manda 93 00:03:37,770 --> 00:03:39,270 entonces el que manda significa 94 00:03:39,270 --> 00:03:41,169 que tú puedes actualizar 95 00:03:41,169 --> 00:03:43,090 a través de jugador el equipo 96 00:03:43,090 --> 00:03:46,129 y si tú tienes un jugador 97 00:03:46,129 --> 00:03:48,090 con un equipo y haces jugador 98 00:03:48,090 --> 00:03:50,069 get equipo y cambias del equipo 99 00:03:50,069 --> 00:03:52,389 el nombre, pues a través del jugador 100 00:03:52,389 --> 00:03:54,250 puedes tocar el equipo, porque el jugador 101 00:03:54,250 --> 00:03:56,289 manda, pero al revés no 102 00:03:56,289 --> 00:03:57,509 aquí en 103 00:03:57,509 --> 00:03:59,669 pero estas cosas 104 00:03:59,669 --> 00:04:01,930 son pequeños comportamientos 105 00:04:01,930 --> 00:04:04,310 matices, cosas que cuando uno trabaja con esto 106 00:04:04,310 --> 00:04:05,990 pues te vas encontrando y ya está 107 00:04:05,990 --> 00:04:07,129 y tampoco tiene mayor 108 00:04:07,129 --> 00:04:09,370 pruebas y de uy, ¿por qué no lo actualizáis? 109 00:04:10,669 --> 00:04:12,110 aquí por ejemplo en equipo 110 00:04:12,110 --> 00:04:13,689 Tienes 111 00:04:13,689 --> 00:04:15,710 Una lista de jugadores 112 00:04:15,710 --> 00:04:17,730 Entonces tú podrías pensar 113 00:04:17,730 --> 00:04:19,189 Yo voy a 114 00:04:19,189 --> 00:04:21,350 Añadirle 115 00:04:21,350 --> 00:04:23,670 Voy a cambiar el equipo de un jugador 116 00:04:23,670 --> 00:04:25,709 Entonces tú podrías plantearte 117 00:04:25,709 --> 00:04:27,490 Intentar hacerlo desde este extremo 118 00:04:27,490 --> 00:04:29,550 Que es, cojo ese jugador 119 00:04:29,550 --> 00:04:30,550 Con el find 120 00:04:30,550 --> 00:04:32,449 Lo meto en la lista 121 00:04:32,449 --> 00:04:35,610 Pues ya está, si lo he metido en la lista 122 00:04:35,610 --> 00:04:37,810 Cuando yo haga el commit 123 00:04:37,810 --> 00:04:39,850 Ya JPA será capaz de decir 124 00:04:39,850 --> 00:04:41,689 Oye, en esta lista está este jugador 125 00:04:41,689 --> 00:04:43,470 pues voy a cambiar el jugador y de 126 00:04:43,470 --> 00:04:45,930 no, no lo va a hacer porque esta no es 127 00:04:45,930 --> 00:04:47,209 la que manda en la relación 128 00:04:47,209 --> 00:04:49,649 entonces de la que se genera el SQL es de la 129 00:04:49,649 --> 00:04:50,949 propietaria, de la otra 130 00:04:50,949 --> 00:04:53,870 bueno, entonces eso pues que 131 00:04:53,870 --> 00:04:56,050 os suene, aunque no haya necesidad 132 00:04:56,050 --> 00:04:57,589 de conocer todos los detalles 133 00:04:57,589 --> 00:04:59,930 ahora mismo, porque es un problema 134 00:04:59,930 --> 00:05:02,129 típico que tú crees que, pero ¿por qué no se actualiza? 135 00:05:02,209 --> 00:05:03,949 ¿por qué no se actualiza? Estás partiendo del extremo 136 00:05:03,949 --> 00:05:05,870 que no es correcto, bueno, de hecho ahora lo vamos a 137 00:05:05,870 --> 00:05:08,050 a ver en un ejemplo 138 00:05:08,050 --> 00:05:09,089 bueno, pues entonces 139 00:05:09,089 --> 00:05:12,389 Estas son las entidades que estamos mapeando 140 00:05:12,389 --> 00:05:14,970 Jugador tiene su equipo 141 00:05:14,970 --> 00:05:16,730 Jugador tiene 142 00:05:16,730 --> 00:05:19,310 Puede tener un perfil 143 00:05:19,310 --> 00:05:21,430 Gamer 144 00:05:21,430 --> 00:05:22,490 Que es aquí 145 00:05:22,490 --> 00:05:24,370 Aquí por eso hay una 146 00:05:24,370 --> 00:05:26,290 O puede no tenerlo 147 00:05:26,290 --> 00:05:27,490 Por eso aquí hay un 148 00:05:27,490 --> 00:05:29,829 Las anotaciones 149 00:05:29,829 --> 00:05:32,350 Pueden tener un montón de atributos 150 00:05:32,350 --> 00:05:33,310 Que las caracterizan 151 00:05:33,310 --> 00:05:35,230 Uno de ellos es el nulable 152 00:05:35,230 --> 00:05:37,490 Entonces aquí el nulable 153 00:05:37,490 --> 00:05:41,589 Por defecto creo que suele ser true 154 00:05:41,589 --> 00:05:42,949 Que es el que nos interesa 155 00:05:42,949 --> 00:05:44,689 O sea, el jugador no tiene por qué tener obligatorio 156 00:05:44,689 --> 00:05:45,769 Un perfil gamer 157 00:05:45,769 --> 00:05:47,430 ¿Vale? No tiene por qué 158 00:05:47,430 --> 00:05:50,610 Si quisiéramos que tuviera obligatoriamente uno 159 00:05:50,610 --> 00:05:52,430 Pues habría que poner un nulable igual false 160 00:05:52,430 --> 00:05:53,970 Propiedades 161 00:05:53,970 --> 00:05:55,370 Esta otra propiedad 162 00:05:55,370 --> 00:05:57,170 Recordad que significaba 163 00:05:57,170 --> 00:05:58,949 Que a través de jugador 164 00:05:58,949 --> 00:06:01,649 Se traslada la persistencia 165 00:06:01,649 --> 00:06:02,329 A su 166 00:06:02,329 --> 00:06:06,050 A su relacionado perfil gamer 167 00:06:06,050 --> 00:06:06,509 ¿Vale? 168 00:06:06,509 --> 00:06:23,910 Si yo hago un jugador, le meto un perfil, todo esto en objeto transitorio los dos, jugador y perfil, y hago un persist de jugador, pues el persist viaja en cascada hasta este y también se hará el persist del perfil gamer de este objeto, ¿vale? 169 00:06:23,910 --> 00:06:33,089 Sin embargo, si yo no pongo este atributo, por defecto no se hace ninguna cascada, ni en Persis, ni en Remus, ni en nada. 170 00:06:33,569 --> 00:06:49,610 Bueno, aquí tenemos el otro extremo de la relación y ahora esta ya sí era la relación de muchos a muchos entre jugador y videojuego, que la hacíamos a través de esta tabla, ¿vale? 171 00:06:49,610 --> 00:06:52,970 Entonces esta tabla es la que se supone 172 00:06:52,970 --> 00:06:54,589 Que mapea, perdón 173 00:06:54,589 --> 00:06:56,670 Esta entidad es la que mapea 174 00:06:56,670 --> 00:06:58,629 Esta tabla, esa entidad 175 00:06:58,629 --> 00:06:59,730 Es la que la mapea 176 00:06:59,730 --> 00:07:02,230 Y esta entidad tiene entonces 177 00:07:02,230 --> 00:07:04,170 Un jugador y un videojuego 178 00:07:04,170 --> 00:07:06,149 Que son los otros extremos 179 00:07:06,149 --> 00:07:07,350 Los many to one 180 00:07:07,350 --> 00:07:09,110 De aquí 181 00:07:09,110 --> 00:07:11,029 De este 182 00:07:11,029 --> 00:07:14,629 Y en videojuego igual 183 00:07:14,629 --> 00:07:17,129 Videojuego 184 00:07:17,129 --> 00:07:18,769 Tiene esta de aquí 185 00:07:18,769 --> 00:07:21,230 Que es el otro extremo 186 00:07:21,230 --> 00:07:23,089 De esta de aquí 187 00:07:23,089 --> 00:07:26,980 Y luego además tiene 188 00:07:26,980 --> 00:07:29,279 Estos dos propiedades 189 00:07:29,279 --> 00:07:30,680 ¿Vale? 190 00:07:36,019 --> 00:07:37,920 Pues cuando no haya estado 191 00:07:37,920 --> 00:07:39,379 Ahora vamos a quitar el estado 192 00:07:39,379 --> 00:07:40,639 Vamos a hacer una versión 193 00:07:40,639 --> 00:07:43,100 De por ejemplo 194 00:07:43,100 --> 00:07:44,480 De que esta aplicación 195 00:07:44,480 --> 00:07:46,339 La jugador videojuego 196 00:07:46,339 --> 00:07:48,600 No interesa ni la posición en la que juegas 197 00:07:48,600 --> 00:07:50,240 En ese videojuego ni el nivel en el que estás 198 00:07:50,240 --> 00:07:51,500 entonces si no hace falta 199 00:07:51,500 --> 00:07:54,019 esta entidad desaparece 200 00:07:54,019 --> 00:07:56,319 entonces tienes que poner many to many en las otras 201 00:07:56,319 --> 00:07:58,339 vale, pues entonces 202 00:07:58,339 --> 00:08:00,019 aquí, ¿qué ocurre con esta tabla? 203 00:08:00,100 --> 00:08:02,420 bueno, videojuego no hay mucho que mirar porque ya tenía 204 00:08:02,420 --> 00:08:04,379 nada, este otro extremo y ya está 205 00:08:04,379 --> 00:08:06,379 y luego el perfil gamer 206 00:08:06,379 --> 00:08:07,959 que tampoco tiene mucho que mirar 207 00:08:07,959 --> 00:08:10,439 tiene su clave primaria y sus propiedades 208 00:08:10,439 --> 00:08:12,160 y la anotación 209 00:08:12,160 --> 00:08:14,040 one to one que lleva aquí 210 00:08:14,040 --> 00:08:16,180 one to one 211 00:08:16,180 --> 00:08:18,680 entonces, en perfil gamer 212 00:08:18,680 --> 00:08:21,079 Aquí marcamos la columna dentro de la tabla 213 00:08:21,079 --> 00:08:23,279 Perfil gamer que te lleva al jugador 214 00:08:23,279 --> 00:08:25,319 Y estas no tienen nada más 215 00:08:25,319 --> 00:08:26,800 Entonces aquí, esta 216 00:08:26,800 --> 00:08:28,740 Clave primaria 217 00:08:28,740 --> 00:08:30,759 Todas las entidades tienen que tener una clave 218 00:08:30,759 --> 00:08:32,080 Es evidente, porque JPA 219 00:08:32,080 --> 00:08:34,940 Trabaja con sus claves 220 00:08:34,940 --> 00:08:36,600 Clave primaria 221 00:08:36,600 --> 00:08:37,779 Las dos 222 00:08:37,779 --> 00:08:40,480 Pues entonces nosotros podemos 223 00:08:40,480 --> 00:08:42,960 Tranquilamente poner aquí esto y esto 224 00:08:42,960 --> 00:08:44,559 Y ya está 225 00:08:44,559 --> 00:08:45,799 Y quedarnos tan tranquilos 226 00:08:45,799 --> 00:08:48,759 y quedarnos tan tranquilos 227 00:08:48,759 --> 00:08:49,940 y esto pues 228 00:08:49,940 --> 00:08:52,559 funciona, entonces vamos a hacer 229 00:08:52,559 --> 00:08:54,399 ahora alguno, os puse una lista de servicios 230 00:08:54,399 --> 00:08:56,080 igual habéis hecho algunos 231 00:08:56,080 --> 00:08:58,679 a lo mejor habéis 232 00:08:58,679 --> 00:08:59,139 metido 233 00:08:59,139 --> 00:09:02,539 que sería lo ideal, claro, un patrón DAO 234 00:09:02,539 --> 00:09:04,440 para cada entidad, un DAO 235 00:09:04,440 --> 00:09:06,179 para cada entidad y luego esos servicios 236 00:09:06,179 --> 00:09:07,820 que utilicen el DAO que sea 237 00:09:07,820 --> 00:09:09,860 vale, entonces el DAO 238 00:09:09,860 --> 00:09:12,440 como es la clase estándar, sota, caballo y rey 239 00:09:12,440 --> 00:09:14,480 pues crear, recuperar 240 00:09:14,480 --> 00:09:15,659 delete, no sé qué 241 00:09:15,659 --> 00:09:18,620 pues como ahora lo que nos interesa 242 00:09:18,620 --> 00:09:19,899 es la parte de JPA 243 00:09:19,899 --> 00:09:22,059 me voy a saltar el dado 244 00:09:22,059 --> 00:09:23,820 vamos a hacer unos servicios 245 00:09:23,820 --> 00:09:25,740 que directamente puentean el dado 246 00:09:25,740 --> 00:09:27,779 llaman ya al persist, al find, a lo que sea 247 00:09:27,779 --> 00:09:30,879 para ir rápidos 248 00:09:30,879 --> 00:09:31,360 pero bueno 249 00:09:31,360 --> 00:09:34,559 entonces vamos a hacer algún servicio 250 00:09:34,559 --> 00:09:36,519 de esos y alguno en particular 251 00:09:36,519 --> 00:09:38,759 para que nos va a llevar 252 00:09:38,759 --> 00:09:39,720 a ver cómo es 253 00:09:39,720 --> 00:09:42,179 mapear las claves de la 254 00:09:42,179 --> 00:09:44,200 tabla conjunta 255 00:09:44,200 --> 00:09:46,440 sí puede ser un poco farragoso 256 00:09:46,440 --> 00:09:48,299 y en ciertas condiciones incluso 257 00:09:48,299 --> 00:09:49,259 podría inducir terror 258 00:09:49,259 --> 00:09:52,120 vale, entonces, ¿qué servicio tenía yo pensado para 259 00:09:52,120 --> 00:09:54,279 ver esto? se me había olvidado, aparte podemos 260 00:09:54,279 --> 00:09:55,919 hacer cualquiera de los servicios que 261 00:09:55,919 --> 00:09:58,139 hayáis hecho vosotros en casa o algún otro que 262 00:09:58,139 --> 00:09:59,039 queráis que hagamos 263 00:09:59,039 --> 00:10:01,519 entonces, vamos a ver 264 00:10:01,519 --> 00:10:05,190 bueno, pues yo aquí tenía 265 00:10:05,190 --> 00:10:09,409 mi clase de servicios 266 00:10:09,409 --> 00:10:10,970 directamente, esta 267 00:10:10,970 --> 00:10:13,990 que puentea al DAO tal cual 268 00:10:13,990 --> 00:10:14,830 ¿vale? 269 00:10:15,830 --> 00:10:16,970 vale, pues entonces 270 00:10:16,970 --> 00:10:18,509 este es el servicio que yo quería 271 00:10:18,509 --> 00:10:23,330 que viéramos 272 00:10:23,330 --> 00:10:27,909 porque no se me ha comentado 273 00:10:27,909 --> 00:10:29,250 porque ya está comentado ahí 274 00:10:29,250 --> 00:10:34,389 ah, pues no le debió dar 275 00:10:34,389 --> 00:10:35,990 con suficiente fuerza 276 00:10:35,990 --> 00:10:37,470 vale 277 00:10:37,470 --> 00:10:39,429 este de aquí es una toma 278 00:10:39,429 --> 00:10:40,649 vale, pues ya está 279 00:10:40,649 --> 00:10:43,789 vale, pues vamos a hacer un 280 00:10:43,789 --> 00:10:45,710 servicio que implique 281 00:10:45,710 --> 00:10:47,389 tocar esa tabla 282 00:10:47,389 --> 00:10:48,809 Que implique tocar esa tabla 283 00:10:48,809 --> 00:10:51,470 Eliminar de un videojuego 284 00:10:51,470 --> 00:10:52,509 Vamos a eliminar un jugador 285 00:10:52,509 --> 00:10:54,129 No sé si ese lo habéis hecho 286 00:10:54,129 --> 00:10:55,929 Es uno de los que a lo mejor hayáis hecho 287 00:10:55,929 --> 00:11:07,149 Vale, pues lo que sí que vamos a respetar 288 00:11:07,149 --> 00:11:08,929 Es que el servicio 289 00:11:08,929 --> 00:11:11,509 Maneje la transacción 290 00:11:11,509 --> 00:11:13,490 El servicio 291 00:11:13,490 --> 00:11:16,169 Se corresponde con una transacción 292 00:11:16,169 --> 00:11:17,490 Eso sí que es lo habitual 293 00:11:17,490 --> 00:11:18,509 ¿Vale? 294 00:11:19,690 --> 00:11:20,850 Y los dados no 295 00:11:20,850 --> 00:11:22,929 Entonces 296 00:11:22,929 --> 00:11:26,759 Dime 297 00:11:26,759 --> 00:11:28,399 La clase de servicios 298 00:11:28,399 --> 00:11:29,279 ¿Cuándo la creaste? 299 00:11:30,340 --> 00:11:32,419 La, no la creé 300 00:11:32,419 --> 00:11:33,919 Pero a ver, la puedes crear tú ahora 301 00:11:33,919 --> 00:11:35,960 Es solo hacer una clase de servicios y ya está 302 00:11:35,960 --> 00:11:38,440 Una clase de servicios, ya está 303 00:11:38,440 --> 00:11:39,600 ¿Vale? 304 00:11:40,240 --> 00:11:40,759 Sí 305 00:11:40,759 --> 00:11:50,720 ¿Qué viejo estás? 306 00:11:51,720 --> 00:11:52,320 ¿Por qué? 307 00:11:52,320 --> 00:11:53,200 Porque va así 308 00:11:53,200 --> 00:11:56,740 Vale 309 00:11:56,740 --> 00:11:58,960 es una clase servicios 310 00:11:58,960 --> 00:11:59,740 en la que he dicho 311 00:11:59,740 --> 00:12:00,159 que voy a poner 312 00:12:00,159 --> 00:12:01,019 algunos servicios 313 00:12:01,019 --> 00:12:02,419 para ejemplificar cosas 314 00:12:02,419 --> 00:12:03,679 puenteando el DAO 315 00:12:03,679 --> 00:12:04,440 porque si nos ponemos 316 00:12:04,440 --> 00:12:05,299 a hacer ahora un DAO 317 00:12:05,299 --> 00:12:06,000 con todas las entidades 318 00:12:06,000 --> 00:12:06,379 que hay 319 00:12:06,379 --> 00:12:06,860 todos nos estamos 320 00:12:06,860 --> 00:12:07,600 mil horas 321 00:12:07,600 --> 00:12:08,940 pero no pasa nada 322 00:12:08,940 --> 00:12:09,600 le podéis 323 00:12:09,600 --> 00:12:10,799 le podéis decir a HGPT 324 00:12:10,799 --> 00:12:11,519 dame unos DAOs 325 00:12:11,519 --> 00:12:12,720 y nos hablamos de tiempo 326 00:12:12,720 --> 00:12:14,059 pero ni eso 327 00:12:14,059 --> 00:12:15,200 vamos a puentear el DAO 328 00:12:15,200 --> 00:12:16,080 porque hacer el DAO 329 00:12:16,080 --> 00:12:16,639 es que ya sabemos 330 00:12:16,639 --> 00:12:17,139 lo que es 331 00:12:17,139 --> 00:12:17,639 el create 332 00:12:17,639 --> 00:12:18,460 pues persist 333 00:12:18,460 --> 00:12:19,559 el get 334 00:12:19,559 --> 00:12:20,139 pues fine 335 00:12:20,139 --> 00:12:20,980 ya está 336 00:12:20,980 --> 00:12:21,299 no 337 00:12:21,299 --> 00:12:23,379 otra cosa es que 338 00:12:23,379 --> 00:12:24,860 luego la arquitectura 339 00:12:24,860 --> 00:12:25,779 de clases que hagamos 340 00:12:25,779 --> 00:12:26,320 que lo hagamos 341 00:12:26,320 --> 00:12:27,460 como uno genérico 342 00:12:27,460 --> 00:12:30,840 y ya está, y luego la implementación 343 00:12:30,840 --> 00:12:32,419 pues se haga para equipo 344 00:12:32,419 --> 00:12:34,279 class, jugador class, o que hagamos 345 00:12:34,279 --> 00:12:36,240 uno para cada uno, eso ya son detalles de 346 00:12:36,240 --> 00:12:38,360 diseño, ¿vale? pero lo que 347 00:12:38,360 --> 00:12:40,279 al fin y al cabo hace el DAO es eso 348 00:12:40,279 --> 00:12:42,679 el persist, el find 349 00:12:42,679 --> 00:12:44,600 pues en lugar de llamar al DAO para hacer el persist 350 00:12:44,600 --> 00:12:46,679 y el find, vamos a hacerlo desde el servicio directamente 351 00:12:46,679 --> 00:12:48,799 y ya está, para no estar aquí escribiendo mil clases 352 00:12:48,799 --> 00:12:50,360 ¿vale? entonces 353 00:12:50,360 --> 00:12:52,620 esta es mi clase servicios con algunas 354 00:12:52,620 --> 00:12:54,639 cosas por aquí que no hicimos 355 00:12:54,639 --> 00:12:56,279 el otro día, porque 356 00:12:56,279 --> 00:12:58,200 hice yo en casa y que están ahí abandonadas 357 00:12:58,200 --> 00:12:59,159 y este método 358 00:12:59,159 --> 00:13:02,279 que si era el que quería que viéramos, pues por ejemplo 359 00:13:02,279 --> 00:13:04,279 vamos a eliminar un jugador de un videojuego que es así 360 00:13:04,279 --> 00:13:06,379 que va a tocar la tabla de muchos 361 00:13:06,379 --> 00:13:06,919 a muchos 362 00:13:06,919 --> 00:13:10,179 vale, tenemos que pasarle el 363 00:13:10,179 --> 00:13:12,139 contexto de persistencia 364 00:13:12,139 --> 00:13:15,960 vale, o podría 365 00:13:15,960 --> 00:13:17,120 trabajar 366 00:13:17,120 --> 00:13:19,679 con un contexto de persistencia 367 00:13:19,679 --> 00:13:20,860 como propiedad 368 00:13:20,860 --> 00:13:23,960 aquí que se le inyectará por constructor 369 00:13:23,960 --> 00:13:28,289 lo que pasa es que entonces 370 00:13:28,289 --> 00:13:30,490 no podemos cerrarlo en cada servicio 371 00:13:30,490 --> 00:13:32,730 el contexto de persistencia 372 00:13:32,730 --> 00:13:34,710 va a estar vivo 373 00:13:34,710 --> 00:13:36,070 todo el tiempo de la aplicación 374 00:13:36,070 --> 00:13:38,730 eso bueno, puede ser un poco 375 00:13:38,730 --> 00:13:40,909 peligroso en cuanto a cachés de objetos 376 00:13:40,909 --> 00:13:42,490 a la hora de hacer el hibernate 377 00:13:42,490 --> 00:13:43,330 la sincronización 378 00:13:43,330 --> 00:13:46,269 normalmente es más habitual 379 00:13:46,269 --> 00:13:48,730 que el contexto de persistencia se abra y se cierre aquí 380 00:13:48,730 --> 00:13:50,690 para lo cual hay que inyectárselo 381 00:13:50,690 --> 00:13:51,230 al método 382 00:13:51,230 --> 00:13:53,929 en estas últimas frases mías 383 00:13:53,929 --> 00:13:56,429 ya se empieza a ver 384 00:13:56,429 --> 00:13:57,789 que es un poco aburrido 385 00:13:57,789 --> 00:14:00,210 en JPA 386 00:14:00,210 --> 00:14:02,509 gestionar objetos que es que van a estar 387 00:14:02,509 --> 00:14:04,350 sí o sí, como el contexto de 388 00:14:04,350 --> 00:14:06,830 persistencia, las transacciones, todo eso 389 00:14:06,830 --> 00:14:08,710 pues entonces 390 00:14:08,710 --> 00:14:10,330 por eso es por lo que Spring dice 391 00:14:10,330 --> 00:14:11,970 Spring JPA dice 392 00:14:11,970 --> 00:14:15,769 que rápido 393 00:14:15,769 --> 00:14:19,190 por eso es por lo que 394 00:14:19,190 --> 00:14:20,870 Spring Data JPA 395 00:14:20,870 --> 00:14:22,830 con lo que todavía no nos hemos metido 396 00:14:22,830 --> 00:14:24,330 dice no, no, no, no, no 397 00:14:24,330 --> 00:14:26,870 tú olvídate, tu programa 398 00:14:26,870 --> 00:14:28,889 Olvídate de Entity Manager 399 00:14:28,889 --> 00:14:31,309 Olvídate de Transacciones, Commit 400 00:14:31,309 --> 00:14:32,690 Olvídate de todo eso 401 00:14:32,690 --> 00:14:35,570 Yo ya lo crearé cuando haga falta 402 00:14:35,570 --> 00:14:36,970 Lo meteré cuando haga falta 403 00:14:36,970 --> 00:14:37,610 Pues sí 404 00:14:37,610 --> 00:14:41,230 Spring, no JPEG 405 00:14:41,230 --> 00:14:42,889 Entonces, pues sí, qué cómodo 406 00:14:42,889 --> 00:14:46,029 Pero, ostras, cuando salen errores 407 00:14:46,029 --> 00:14:50,470 Antes de echar GPT 408 00:14:50,470 --> 00:14:52,289 Te estabas 17 horas 409 00:14:52,289 --> 00:14:53,929 Después de echar GPT te estás una 410 00:14:53,929 --> 00:14:55,309 Pero te estás una 411 00:14:55,309 --> 00:14:57,350 Entonces sigues en un rollo 412 00:14:57,350 --> 00:14:59,389 Bueno, a ver, entonces 413 00:14:59,389 --> 00:15:00,830 Eliminar jugador de videojuego 414 00:15:00,830 --> 00:15:03,889 ¿Qué le vamos a pasar? Pues las claves de los jugadores 415 00:15:03,889 --> 00:15:08,649 A este jugador 416 00:15:08,649 --> 00:15:10,490 ¿Vale? 417 00:15:10,870 --> 00:15:13,710 Le vamos a eliminar 418 00:15:13,710 --> 00:15:15,690 De este videojuego 419 00:15:15,690 --> 00:15:20,169 Este sería nuestro método de servicio 420 00:15:20,169 --> 00:15:23,139 Ya está 421 00:15:23,139 --> 00:15:27,240 Vale, como vamos a actualizar la base de datos 422 00:15:27,240 --> 00:15:28,399 ¿Eh? 423 00:15:28,519 --> 00:15:29,899 Que me sobra una llave por ahí 424 00:15:29,899 --> 00:15:31,320 Sí está 425 00:15:31,320 --> 00:15:33,899 Como vamos a actualizar la base de datos 426 00:15:33,899 --> 00:15:35,600 Estas cosas sí que pueden ser 427 00:15:35,600 --> 00:15:38,100 Típicas pues de examen 428 00:15:38,100 --> 00:15:39,019 Que yo 429 00:15:39,019 --> 00:15:41,480 Lo que tendréis que hacer en el examen son servicios 430 00:15:41,480 --> 00:15:43,340 Servicios de costos 431 00:15:43,340 --> 00:15:44,639 Pues 432 00:15:44,639 --> 00:15:47,240 No hay problema 433 00:15:47,240 --> 00:15:48,620 Vamos sobraos 434 00:15:48,620 --> 00:15:51,700 Y que no de errores, claro 435 00:15:51,700 --> 00:15:53,059 Y que haga lo que tenga que hacer 436 00:15:53,059 --> 00:15:54,860 Entonces 437 00:15:54,860 --> 00:15:56,820 Vamos a actualizar la base de datos 438 00:15:56,820 --> 00:15:59,559 Aquí habrá que hacer una transacción 439 00:15:59,559 --> 00:16:02,320 sí o sí 440 00:16:02,320 --> 00:16:07,899 entonces de nuevo 441 00:16:07,899 --> 00:16:09,700 qué rollo tener la que gestionar a mano 442 00:16:09,700 --> 00:16:12,059 si esprime la gestionara 443 00:16:12,059 --> 00:16:14,179 qué bien, ya, pero la gestiono 444 00:16:14,179 --> 00:16:15,919 y yo, hombre, yo decido dónde está 445 00:16:15,919 --> 00:16:17,860 han decidido qué transacciones 446 00:16:17,860 --> 00:16:19,279 quiero, cuáles no, pues hombre 447 00:16:19,279 --> 00:16:21,539 decido, no me anulan como ser humano 448 00:16:21,539 --> 00:16:23,960 pues entonces 449 00:16:23,960 --> 00:16:26,039 uno podría decir, vale, pues vamos a coger 450 00:16:26,039 --> 00:16:27,980 primero el jugador y el videojuego 451 00:16:27,980 --> 00:16:29,460 vale 452 00:16:29,460 --> 00:16:30,720 entonces 453 00:16:30,720 --> 00:16:33,840 Cogemos 454 00:16:33,840 --> 00:16:34,960 Jugador 455 00:16:34,960 --> 00:16:37,659 J igual a new 456 00:16:37,659 --> 00:16:40,000 Jugador 457 00:16:40,000 --> 00:16:41,039 No, ¿por qué digo yo new? 458 00:16:42,299 --> 00:16:43,879 End.find 459 00:16:43,879 --> 00:16:47,879 Jugador 460 00:16:47,879 --> 00:16:49,460 Punto 461 00:16:49,460 --> 00:16:51,259 Class y aquí la clave 462 00:16:51,259 --> 00:16:52,799 Id de jugador 463 00:16:52,799 --> 00:17:03,429 Videojuego 464 00:17:03,429 --> 00:17:05,230 V igual a 465 00:17:05,230 --> 00:17:06,970 End.find 466 00:17:06,970 --> 00:17:10,599 Uy 467 00:17:10,599 --> 00:17:17,660 videojuego.class 468 00:17:17,660 --> 00:17:18,380 id 469 00:17:18,380 --> 00:17:20,759 videojuego 470 00:17:20,759 --> 00:17:26,369 entonces ya tenemos estas entidades 471 00:17:26,369 --> 00:17:27,450 que tenemos que 472 00:17:27,450 --> 00:17:29,150 desasociar 473 00:17:29,150 --> 00:17:32,130 entonces aquí 474 00:17:32,130 --> 00:17:34,549 tal y como 475 00:17:34,549 --> 00:17:35,690 lo tenemos planteado 476 00:17:35,690 --> 00:17:36,930 pues 477 00:17:36,930 --> 00:17:40,609 hay varios caminos por los que podemos atacar 478 00:17:40,609 --> 00:17:42,230 pero son todos un poco liosos 479 00:17:42,230 --> 00:17:44,609 me puedo sacar el videojuego 480 00:17:44,609 --> 00:17:46,609 y decir vale voy a quitar 481 00:17:46,609 --> 00:17:47,589 del videojuego 482 00:17:47,589 --> 00:17:51,029 la asociación que tiene con el jugador 483 00:17:51,029 --> 00:17:52,589 ¿vale? que es lo que 484 00:17:52,589 --> 00:17:58,099 aquí, a ver 485 00:17:58,099 --> 00:18:02,009 jugador 486 00:18:02,009 --> 00:18:03,269 punto get 487 00:18:03,269 --> 00:18:05,930 jugador videojuegos 488 00:18:05,930 --> 00:18:07,569 y entonces 489 00:18:07,569 --> 00:18:09,710 si jpafuera tan potente y tan 490 00:18:09,710 --> 00:18:12,009 pues tendríamos que hacer aquí 491 00:18:12,009 --> 00:18:14,109 vale, de jugador videojuegos que es la lista 492 00:18:14,109 --> 00:18:16,369 voy a borrar 493 00:18:16,369 --> 00:18:18,349 voy a borrar 494 00:18:18,349 --> 00:18:19,150 el que voy a borrar 495 00:18:19,150 --> 00:18:21,109 un juego, perdón 496 00:18:21,109 --> 00:18:23,150 Un jugador videojuego 497 00:18:23,150 --> 00:18:25,670 Que sea igual al que tiene esto de aquí 498 00:18:25,670 --> 00:18:27,710 ¿Vale? Entonces esto tendría sentido 499 00:18:27,710 --> 00:18:29,269 Hacerlo, en Java esto tiene sentido 500 00:18:29,269 --> 00:18:30,650 New 501 00:18:30,650 --> 00:18:34,210 Jugador 502 00:18:34,210 --> 00:18:36,849 Videojuegos 503 00:18:36,849 --> 00:18:41,690 Y ahora 504 00:18:41,690 --> 00:18:45,170 Tengo un constructor en jugador videojuego 505 00:18:45,170 --> 00:18:47,109 Bueno, vamos a hacerlo 506 00:18:47,109 --> 00:18:49,089 Para que no quede la línea 507 00:18:49,089 --> 00:18:50,549 Tan grande, tan larga 508 00:18:50,549 --> 00:18:51,430 Lo voy a hacer aparte 509 00:18:51,430 --> 00:18:53,549 Jugador videojuego 510 00:18:54,410 --> 00:19:15,109 no, los dos lo tengo que pasar, jugador videojuegos se caracteriza por los dos, jugador videojuegos jv igual a new, jugador videojuegos, vale, y ahora, jugador videojuego, perdón, jugador videojuego, 511 00:19:15,109 --> 00:19:21,619 Y ahora a jugador videojuego 512 00:19:21,619 --> 00:19:23,720 Set jugador el J 513 00:19:23,720 --> 00:19:27,539 Y jugador videojuego 514 00:19:27,539 --> 00:19:28,140 Set 515 00:19:28,140 --> 00:19:31,559 Videojuego el V 516 00:19:31,559 --> 00:19:39,279 ¿Vale? 517 00:19:41,119 --> 00:19:42,079 Entonces 518 00:19:42,079 --> 00:19:44,319 Este remove 519 00:19:44,319 --> 00:19:46,119 Ya sabemos 520 00:19:46,119 --> 00:19:47,759 Jugador videojuegos 521 00:19:47,759 --> 00:19:51,619 Ya sabemos que funciona 522 00:19:51,619 --> 00:19:53,380 Si hay un equals 523 00:19:53,380 --> 00:19:54,240 Lógicamente 524 00:19:54,240 --> 00:19:56,920 ¿Vale? Entonces yo aquí 525 00:19:56,920 --> 00:19:58,519 Haría mi 526 00:19:58,519 --> 00:20:04,329 Transaction.commit 527 00:20:04,329 --> 00:20:07,250 Y en .close 528 00:20:07,250 --> 00:20:09,069 ¿Vale? 529 00:20:10,289 --> 00:20:10,730 Entonces 530 00:20:10,730 --> 00:20:12,130 Esto 531 00:20:12,130 --> 00:20:14,690 En principio tiene sentido 532 00:20:14,690 --> 00:20:15,430 ¿Vale? 533 00:20:15,849 --> 00:20:18,450 Pero primera cosa que aquí habría que retocar 534 00:20:18,450 --> 00:20:20,410 Esto solo funciona, lógicamente 535 00:20:20,410 --> 00:20:22,210 Si hay un equals 536 00:20:22,210 --> 00:20:24,789 Si hay un equals en jugador videojuego 537 00:20:24,789 --> 00:20:27,630 por jugador 538 00:20:27,630 --> 00:20:29,670 y por videojuego, lógicamente 539 00:20:29,670 --> 00:20:31,529 porque el remove te borra 540 00:20:31,529 --> 00:20:33,509 un objeto igual a este 541 00:20:33,509 --> 00:20:35,410 dentro de la colección, igual a este 542 00:20:35,410 --> 00:20:37,910 luego tiene que haber un equals basado en jugador y videojuego 543 00:20:37,910 --> 00:20:39,789 y es que ese equals 544 00:20:39,789 --> 00:20:40,670 tiene sentido 545 00:20:40,670 --> 00:20:42,650 entonces, jugador videojuego 546 00:20:42,650 --> 00:20:44,630 pues no pasa nada, le hacemos 547 00:20:44,630 --> 00:20:48,329 le hacemos a jugador y videojuego 548 00:20:48,329 --> 00:20:49,849 un hashcode e equals 549 00:20:49,849 --> 00:20:51,750 nada, se lo hace 550 00:20:51,750 --> 00:20:53,750 y generar hashcode e equals 551 00:20:53,750 --> 00:20:56,009 Por jugador y por videojuego 552 00:20:56,009 --> 00:21:08,710 Pero cuidadín, no perdáis la línea 553 00:21:08,710 --> 00:21:12,609 El equals por jugador y videojuego 554 00:21:12,609 --> 00:21:14,130 También va a implicar 555 00:21:14,130 --> 00:21:16,950 Que esté el equals dentro de jugador 556 00:21:16,950 --> 00:21:18,750 Y el equals dentro de videojuego 557 00:21:18,750 --> 00:21:19,730 Lógicamente 558 00:21:19,730 --> 00:21:22,509 Porque el equals de jugador y videojuego 559 00:21:22,509 --> 00:21:24,630 Mira a ver si jugador es igual a jugador 560 00:21:24,630 --> 00:21:26,950 Y videojuego es igual a videojuego 561 00:21:26,950 --> 00:21:28,950 Con lo cual jugador y videojuego 562 00:21:28,950 --> 00:21:30,470 Tienen que tener su propio equals 563 00:21:30,470 --> 00:21:33,190 Pero ese equals estará basado en id 564 00:21:33,190 --> 00:21:35,470 Pues nada, le hacéis a jugador 565 00:21:35,470 --> 00:21:38,049 Un equals basado en el id 566 00:21:38,049 --> 00:21:43,559 Que os quedará como este 567 00:21:43,559 --> 00:21:45,460 Y a videojuego 568 00:21:45,460 --> 00:21:47,519 Otro equals basado en su id 569 00:21:47,519 --> 00:21:51,200 Que os quedará como este 570 00:21:51,200 --> 00:22:05,859 Porque da lo mismo 571 00:22:05,859 --> 00:22:08,500 O sea, da igual, por cualquiera de los dos 572 00:22:08,500 --> 00:22:10,799 Llegas a la misma, en JPA está todo duplicado 573 00:22:10,799 --> 00:22:11,660 ¿Vale? 574 00:22:13,660 --> 00:22:14,720 Claro, que puedes hacer 575 00:22:14,720 --> 00:22:15,740 V.g 576 00:22:15,740 --> 00:22:18,880 Vale, entonces 577 00:22:18,880 --> 00:22:24,859 Y ahora me quedo aquí con mi servicio 578 00:22:24,859 --> 00:22:26,059 Que está aquí 579 00:22:26,059 --> 00:22:27,019 Vale 580 00:22:27,019 --> 00:22:30,740 Entonces este es un ejemplo de muchas cosas 581 00:22:30,740 --> 00:22:33,000 Que vamos a probarlo 582 00:22:33,000 --> 00:22:35,000 Entonces 583 00:22:35,000 --> 00:22:36,140 Yo en mi tabla 584 00:22:36,140 --> 00:22:38,599 No sé vosotros en la vuestra 585 00:22:38,599 --> 00:22:41,140 Pero yo en la mía tengo 586 00:22:41,140 --> 00:22:42,920 Al jugador 3 587 00:22:42,920 --> 00:22:44,259 En el videojuego 2 588 00:22:44,259 --> 00:22:47,019 Voy a intentar quitarlo 589 00:22:47,019 --> 00:22:48,940 Al jugador 3, videojuego 2 590 00:22:48,940 --> 00:22:52,910 Primero le estoy dando 591 00:22:52,910 --> 00:22:56,430 el jugador y luego el videojuego, vale, entonces haceos un main 592 00:22:56,430 --> 00:23:00,349 un main normal y corriente, haceos un main 593 00:23:00,349 --> 00:23:06,349 para probar los servicios, vale 594 00:23:06,349 --> 00:23:09,930 este es mi main, donde me instancio servicios para probarlo 595 00:23:09,930 --> 00:23:14,170 esto todo lo voy a dejar comentado porque son mis 596 00:23:14,170 --> 00:23:22,269 pruebas, esta es la que me interesa 597 00:23:22,269 --> 00:23:25,150 haceos un main 598 00:23:25,150 --> 00:23:26,609 que instancia esta clase 599 00:23:26,609 --> 00:23:32,150 y vamos a eliminar jugador 600 00:23:32,150 --> 00:23:34,029 videojuego, en mi caso 601 00:23:34,029 --> 00:23:36,470 voy a eliminar el jugador 3 602 00:23:36,470 --> 00:23:37,390 videojuego 2 603 00:23:37,390 --> 00:23:47,690 recordad que aquí hay que pasarle 604 00:23:47,690 --> 00:23:49,990 el contexto de persistencia, el entity manager 605 00:23:49,990 --> 00:23:51,829 yo por eso me he copiado 606 00:23:51,829 --> 00:23:54,230 la clase jpa útil del otro proyecto 607 00:23:54,230 --> 00:23:56,170 y ya está, por eso os copiáis la clase 608 00:23:56,170 --> 00:23:57,509 si es que no la tenéis copiada 609 00:23:57,509 --> 00:23:58,990 el paquete entero 610 00:23:58,990 --> 00:24:02,549 os copiáis el paquete entero del otro proyecto y se acabó 611 00:24:02,549 --> 00:24:03,569 ¿eh? dime 612 00:24:03,569 --> 00:24:06,910 Sí, es que lo he quitado a propósito 613 00:24:06,910 --> 00:24:08,930 Para que, por si alguien 614 00:24:08,930 --> 00:24:10,230 Yo que sé, para ir recordando cosas 615 00:24:10,230 --> 00:24:12,869 Vale, entonces 616 00:24:12,869 --> 00:24:14,990 Aquí acordaos 617 00:24:14,990 --> 00:24:15,990 De que cuando a Java 618 00:24:15,990 --> 00:24:18,730 Le dais un número sin más 619 00:24:18,730 --> 00:24:20,930 Él automáticamente lo interpreta 620 00:24:20,930 --> 00:24:23,450 Como int y lo guarda en variable de 32 bits 621 00:24:23,450 --> 00:24:24,470 Lo guarda como int 622 00:24:24,470 --> 00:24:27,960 Aquí, él me está diciendo 623 00:24:27,960 --> 00:24:29,579 Perdona, me estás dando un tipo i 624 00:24:29,579 --> 00:24:31,500 Para un método que necesita un tipo long 625 00:24:31,500 --> 00:24:32,779 Entonces no le gusta 626 00:24:32,779 --> 00:24:35,359 ¿Cómo forzamos a que Java 627 00:24:35,359 --> 00:24:38,660 Un numerito te lo guarde en 64 bits 628 00:24:38,660 --> 00:24:39,700 En lugar de 32? 629 00:24:40,339 --> 00:24:42,039 Pues le forzábamos poniéndole 630 00:24:42,039 --> 00:24:43,599 La L después 631 00:24:43,599 --> 00:24:45,759 ¿Pero esto lo tenías en mayúsculas? 632 00:24:45,920 --> 00:24:48,279 ¿Para el envolvente dentro? 633 00:24:49,119 --> 00:24:49,859 No, no, no 634 00:24:49,859 --> 00:24:51,319 Lo tenía en mayúsculas 635 00:24:51,319 --> 00:24:53,279 Porque yo lo veo más claro en mayúsculas 636 00:24:53,279 --> 00:24:54,920 Porque esto parece 31-21 637 00:24:54,920 --> 00:24:56,839 De hecho lo he puesto a propósito 638 00:24:56,839 --> 00:24:59,859 Para que veáis lo feo que queda 639 00:24:59,859 --> 00:25:01,640 Entonces en un código 640 00:25:01,640 --> 00:25:04,819 lo natural sería ponerlo en mayúscula 641 00:25:04,819 --> 00:25:06,859 por no confundirlo con el dígito 642 00:25:06,859 --> 00:25:07,180 1 643 00:25:07,180 --> 00:25:11,000 funciona igual porque el código ASCII es el de la L 644 00:25:11,000 --> 00:25:11,859 no es el del 1 645 00:25:11,859 --> 00:25:14,519 entonces lo que está realmente codificado es 646 00:25:14,519 --> 00:25:15,980 la L, no el 1, dime 647 00:25:15,980 --> 00:25:18,539 ¿el JPA útil de dónde sale? 648 00:25:19,480 --> 00:25:20,579 del otro proyecto 649 00:25:20,579 --> 00:25:22,220 ya lo tenemos hecho, lo copias y pegas 650 00:25:22,220 --> 00:25:24,960 el JPA útil, ya lo hicimos 651 00:25:24,960 --> 00:25:26,500 es una clase que nos 652 00:25:26,500 --> 00:25:27,759 era una utilidad 653 00:25:27,759 --> 00:25:30,339 para crear a través de este método 654 00:25:30,339 --> 00:25:33,000 Un entity manager cada vez que lo quisiéramos 655 00:25:33,000 --> 00:25:34,700 Cada vez uno nuevo 656 00:25:34,700 --> 00:25:35,839 Porque no es un singleton 657 00:25:35,839 --> 00:25:37,400 El que es el singleton es este 658 00:25:37,400 --> 00:25:40,319 Entonces del otro proyecto que hicimos lo copias y ya está 659 00:25:40,319 --> 00:25:45,920 ¿Vale? Entonces 660 00:25:45,920 --> 00:25:48,200 Primero es que funcione 661 00:25:48,200 --> 00:25:49,599 Porque ya hemos puesto las anotaciones bien 662 00:25:49,599 --> 00:25:52,519 Y luego es si elimina 663 00:25:52,519 --> 00:25:53,859 Vamos a ver 664 00:25:53,859 --> 00:26:04,400 Deletes no ha hecho 665 00:26:04,400 --> 00:26:07,160 Con lo cual es imposible que lo haya borrado 666 00:26:07,160 --> 00:26:07,759 ¿Vale? 667 00:26:09,359 --> 00:26:09,799 Vale 668 00:26:09,799 --> 00:26:13,960 Entonces, ¿cuál ha sido aquí el problema? 669 00:26:14,819 --> 00:26:18,519 No ha sido que nuestro equals, el remove, ¿no? 670 00:26:18,660 --> 00:26:19,819 Si esto está estupendo 671 00:26:19,819 --> 00:26:21,160 No ha sido el remove 672 00:26:21,160 --> 00:26:24,160 El problema es lo que os he dicho al principio 673 00:26:24,160 --> 00:26:29,759 Que estamos borrando a través de quien no es propietaria 674 00:26:29,759 --> 00:26:32,500 Estamos borrando a través de jugador 675 00:26:32,500 --> 00:26:34,779 Jugador no es la propietaria 676 00:26:34,779 --> 00:26:37,539 Jugador tiene el extremo 677 00:26:37,539 --> 00:26:39,279 aquí 678 00:26:39,279 --> 00:26:41,759 este 679 00:26:41,759 --> 00:26:44,279 entonces ese borrado no se va a hacer 680 00:26:44,279 --> 00:26:46,380 ¿vale? ese borrado no se va a hacer 681 00:26:46,380 --> 00:26:48,519 la que manda es esta otra 682 00:26:48,519 --> 00:26:50,180 entonces 683 00:26:50,180 --> 00:26:52,839 ¿qué otra forma 684 00:26:52,839 --> 00:26:53,640 podríamos hacer? 685 00:26:54,279 --> 00:26:56,720 y veréis que rollo, por eso tenemos que poner solución 686 00:26:56,720 --> 00:26:58,140 a este rollo 687 00:26:58,140 --> 00:27:00,200 ¿dónde estamos? aquí en servicios 688 00:27:00,200 --> 00:27:00,680 vale 689 00:27:00,680 --> 00:27:02,880 pues 690 00:27:02,880 --> 00:27:06,299 ¿vale? 691 00:27:06,299 --> 00:27:13,670 La solución 692 00:27:13,670 --> 00:27:15,309 Mejor entre comillas 693 00:27:15,309 --> 00:27:16,210 Hacerlo con una delete 694 00:27:16,210 --> 00:27:20,049 Lo podemos hacer todo siempre con una delete 695 00:27:20,049 --> 00:27:20,710 Y ya está 696 00:27:20,710 --> 00:27:23,150 Hacer una query que borre 697 00:27:23,150 --> 00:27:25,490 Delete from videojuego 698 00:27:25,490 --> 00:27:27,990 Where jv no se que 699 00:27:27,990 --> 00:27:29,950 Hacer una jpql delete 700 00:27:29,950 --> 00:27:30,430 Y ya está 701 00:27:30,430 --> 00:27:31,930 Hacemos una query 702 00:27:31,930 --> 00:27:34,130 Y le pedimos 703 00:27:34,130 --> 00:27:36,390 Y la otra 704 00:27:36,390 --> 00:27:37,170 Esto de aquí 705 00:27:37,170 --> 00:27:37,589 Vale 706 00:27:37,589 --> 00:27:43,170 E 707 00:27:43,170 --> 00:27:45,750 la otra, vamos a 708 00:27:45,750 --> 00:27:47,670 quedarnos, en lugar 709 00:27:47,670 --> 00:27:49,190 de borrar, ¿dónde estoy? aquí 710 00:27:49,190 --> 00:27:51,089 aquí 711 00:27:51,089 --> 00:27:53,289 en lugar de borrar 712 00:27:53,289 --> 00:27:55,970 a este elemento 713 00:27:55,970 --> 00:27:59,589 a través de J 714 00:27:59,589 --> 00:28:01,829 que no puedo, porque J no es el propietario 715 00:28:01,829 --> 00:28:03,589 voy a sacarme 716 00:28:03,589 --> 00:28:05,809 el elemento y le voy a hacer el remove a él directamente 717 00:28:05,809 --> 00:28:07,750 voy a sacármelo de aquí 718 00:28:07,750 --> 00:28:09,630 de esta conexión 719 00:28:09,630 --> 00:28:11,509 voy a sacarme el elemento y le voy a hacer 720 00:28:11,509 --> 00:28:13,890 Entonces, esto 721 00:28:13,890 --> 00:28:15,869 Pues lo podríamos hacer 722 00:28:15,869 --> 00:28:18,390 Jugador de videojuegos 723 00:28:18,390 --> 00:28:19,690 ¿Vale? Vamos a filtrar 724 00:28:19,690 --> 00:28:20,809 A quedarnos con el bueno 725 00:28:20,809 --> 00:28:29,539 Vamos a hacerlo más bonito 726 00:28:29,539 --> 00:28:30,000 ¿Vale? 727 00:28:33,789 --> 00:28:34,869 Que os gusta más así 728 00:28:34,869 --> 00:28:37,970 ¿Aquí qué tenemos que hacer? 729 00:28:38,049 --> 00:28:39,410 Pues un filter, lógicamente 730 00:28:39,410 --> 00:28:42,390 Vamos a quedarnos 731 00:28:42,390 --> 00:28:44,609 De cada elemento de la lista 732 00:28:44,609 --> 00:28:46,309 Nos vamos a quedar 733 00:28:46,309 --> 00:28:49,150 Solamente con aquel 734 00:28:49,150 --> 00:28:49,869 Uy 735 00:28:49,869 --> 00:28:55,410 Que sea igual 736 00:28:55,410 --> 00:28:57,289 A 737 00:28:57,289 --> 00:29:02,329 JV 738 00:29:02,329 --> 00:29:04,109 A este 739 00:29:04,109 --> 00:29:06,089 ¿Vale? 740 00:29:07,009 --> 00:29:08,569 Lo que dices tú de get 741 00:29:08,569 --> 00:29:10,869 Directamente no puedes, eso lo podrías hacer con un diccionario 742 00:29:10,869 --> 00:29:12,950 Con un mapa, con esto no, tienes que hacer un recorrido 743 00:29:12,950 --> 00:29:15,029 Entonces ese recorrido lo agarramos con el stream 744 00:29:15,029 --> 00:29:16,930 Vale, entonces me quedo 745 00:29:16,930 --> 00:29:19,130 Con aquel que sea igual a JV 746 00:29:19,130 --> 00:29:22,230 Que entendemos que es solamente uno 747 00:29:22,230 --> 00:29:23,509 Con lo cual 748 00:29:23,509 --> 00:29:25,009 Le cojo 749 00:29:25,009 --> 00:29:26,769 Y como es un optional 750 00:29:26,769 --> 00:29:29,329 Cogemos a lo bestia 751 00:29:29,329 --> 00:29:31,390 Ni orel directamente get 752 00:29:31,390 --> 00:29:32,509 Si me da nul, me da nul 753 00:29:32,509 --> 00:29:35,710 Si es que nosotros estamos por encima de los nules 754 00:29:35,710 --> 00:29:36,809 Vale 755 00:29:36,809 --> 00:29:38,250 Y aquí ya la puedo coger 756 00:29:38,250 --> 00:29:39,609 Jugador 757 00:29:39,609 --> 00:29:43,130 Videojuego 758 00:29:43,130 --> 00:29:45,490 Jugador 759 00:29:45,490 --> 00:29:47,450 Esta es la que quiero borrar 760 00:29:47,450 --> 00:29:57,779 sí, sí, sí, esto es que no va a hacer nada 761 00:29:57,779 --> 00:30:00,259 pero tienes razón 762 00:30:00,259 --> 00:30:01,319 que es buena idea quitarlo 763 00:30:01,319 --> 00:30:03,799 porque esto no va a hacer nada cuando se vaya a sincronizar 764 00:30:03,799 --> 00:30:05,220 pero los objetos 765 00:30:05,220 --> 00:30:08,059 dentro del contexto de persistencia se quedan marcados 766 00:30:08,059 --> 00:30:09,940 con marcas, este en particular se queda 767 00:30:09,940 --> 00:30:11,359 que en la colección este ya no está 768 00:30:11,359 --> 00:30:14,299 con lo cual este nos daría que no lo encuentre 769 00:30:14,299 --> 00:30:16,019 entonces sería un problema 770 00:30:16,019 --> 00:30:17,619 efectivamente, si yo no lo llego a quitar 771 00:30:17,619 --> 00:30:20,299 que es que se me había olvidado, me habría dado cuenta al ejecutarlo 772 00:30:20,299 --> 00:30:21,539 pero 773 00:30:21,539 --> 00:30:22,799 de que no hace nada 774 00:30:22,799 --> 00:30:25,079 y es porque lo hemos quitado de la colección 775 00:30:25,079 --> 00:30:27,059 entonces este filter 776 00:30:27,059 --> 00:30:28,640 no lo encontraría 777 00:30:28,640 --> 00:30:31,420 entonces, ahora ya 778 00:30:31,420 --> 00:30:33,700 este de aquí es el objeto persistente 779 00:30:33,700 --> 00:30:36,019 que hemos sacado de aquí, y este como es persistente 780 00:30:36,019 --> 00:30:37,579 le aplica 781 00:30:37,579 --> 00:30:39,440 esto si a mí me da la gana, perdón 782 00:30:39,440 --> 00:30:39,960 el remove 783 00:30:39,960 --> 00:30:43,740 remove, borrar 784 00:30:43,740 --> 00:30:53,930 ¿vale? o sea 785 00:30:53,930 --> 00:30:56,210 este def lo hemos podido hacer 786 00:30:56,210 --> 00:30:58,009 sin problemas, porque 787 00:30:58,009 --> 00:31:00,210 estamos en el contexto 788 00:31:00,210 --> 00:31:01,589 de una transacción 789 00:31:01,589 --> 00:31:03,869 por muy lazy que sea 790 00:31:03,869 --> 00:31:04,829 que será lazy 791 00:31:04,829 --> 00:31:06,990 si no lo hemos puesto por 792 00:31:06,990 --> 00:31:09,349 supongo que lo habremos puesto 793 00:31:09,349 --> 00:31:10,529 y si no será por defecto 794 00:31:10,529 --> 00:31:13,069 donde está jugador 795 00:31:13,069 --> 00:31:14,690 jugador 796 00:31:14,690 --> 00:31:17,799 aquí 797 00:31:17,799 --> 00:31:20,519 no lo hemos puesto el fetch type 798 00:31:20,519 --> 00:31:22,599 por lo cual será lazy que es algo por defecto 799 00:31:22,599 --> 00:31:25,519 entonces por muy lazy que sea 800 00:31:25,519 --> 00:31:31,950 si pero esta es la otra 801 00:31:31,950 --> 00:31:32,829 esta es la otra 802 00:31:32,829 --> 00:31:34,430 porque esta por defecto si que es eager 803 00:31:34,430 --> 00:31:36,589 las many to one por defecto si que son eager 804 00:31:36,589 --> 00:31:37,230 por eso es así 805 00:31:37,230 --> 00:31:39,930 la hemos puesto específica 806 00:31:39,930 --> 00:31:40,630 por defecto para eso 807 00:31:40,630 --> 00:31:42,769 Iger 808 00:31:42,769 --> 00:31:44,549 porque esta no pesa tanto 809 00:31:44,549 --> 00:31:45,509 porque es solo un objeto 810 00:31:45,509 --> 00:31:46,309 el que recupera 811 00:31:46,309 --> 00:31:46,990 sin embargo este 812 00:31:46,990 --> 00:31:47,990 recupera una lista entera 813 00:31:47,990 --> 00:31:49,109 entonces este sí que pesa más 814 00:31:49,109 --> 00:31:50,170 por eso por defecto es lazy 815 00:31:50,170 --> 00:31:50,690 pues bueno 816 00:31:50,690 --> 00:31:52,450 por muy lazy que sea 817 00:31:52,450 --> 00:31:53,170 que lo es 818 00:31:53,170 --> 00:31:55,589 aquí estamos en el contexto 819 00:31:55,589 --> 00:31:56,470 de una transacción 820 00:31:56,470 --> 00:31:57,109 entonces 821 00:31:57,109 --> 00:31:59,009 este get de aquí 822 00:31:59,009 --> 00:32:00,089 no da un 823 00:32:00,089 --> 00:32:00,789 ¿vale? 824 00:32:01,309 --> 00:32:02,170 sin embargo 825 00:32:02,170 --> 00:32:04,329 si estuviéramos con sprint data 826 00:32:04,329 --> 00:32:07,210 esto nos daría un lazy 827 00:32:07,210 --> 00:32:10,029 exception, un segundín, que te cagas 828 00:32:10,029 --> 00:32:11,730 ¿por qué? porque el gestor de las 829 00:32:11,730 --> 00:32:13,009 transacciones como le da la gana 830 00:32:13,009 --> 00:32:15,109 entonces nosotros tenemos que preocuparnos y decirle 831 00:32:15,109 --> 00:32:16,390 uy, cuidado, cuidado 832 00:32:16,390 --> 00:32:19,130 y anotarlo, anotarlo 833 00:32:19,130 --> 00:32:21,109 para que la gestione como queremos nosotros 834 00:32:21,109 --> 00:32:22,849 ¿vale? entonces 835 00:32:22,849 --> 00:32:25,109 digo simplemente que no es que Sprint te lo haga todo 836 00:32:25,109 --> 00:32:26,609 te lo hace todo si lo anotas bien 837 00:32:26,609 --> 00:32:29,009 ¿vale? dime 838 00:32:29,009 --> 00:32:40,829 Sí, sí, sí, es lo que he dicho al principio 839 00:32:40,829 --> 00:32:42,329 que vamos a puentear el DAO 840 00:32:42,329 --> 00:32:44,990 para no escribir, o sea, esta aplicación 841 00:32:44,990 --> 00:32:46,490 que estamos de aquí 842 00:32:46,490 --> 00:32:48,930 ¿vale? Tendría que tener 843 00:32:48,930 --> 00:32:50,829 su capa de DAO con los cuatro 844 00:32:50,829 --> 00:32:52,890 métodos básicos, pero claro, para no 845 00:32:52,890 --> 00:32:55,190 eternizarnos haciendo esto, me interesa lo de JPA 846 00:32:55,190 --> 00:32:56,970 por eso he dicho, vamos a puentear 847 00:32:56,970 --> 00:32:58,509 el DAO y que el servicio 848 00:32:58,509 --> 00:33:00,609 llame directamente a los métodos de 849 00:33:00,609 --> 00:33:01,089 NC Manager 850 00:33:01,089 --> 00:33:14,829 Sí, bueno, a ver, podemos copiar y pegar 851 00:33:14,829 --> 00:33:16,069 aquí el generic DAO 852 00:33:16,069 --> 00:33:18,190 si te angustia 853 00:33:18,190 --> 00:33:20,890 que no haya una capa DAO, o sea, la estoy puenteando 854 00:33:20,890 --> 00:33:22,549 o sea, avisado a sabiendas de que no 855 00:33:22,549 --> 00:33:24,670 trabajamos así, porque lo que estamos ahora 856 00:33:24,670 --> 00:33:26,549 un poco escenificando 857 00:33:26,549 --> 00:33:28,309 según el JPA, entonces para no 858 00:33:28,309 --> 00:33:30,849 meterle la complicación del dao entre medias 859 00:33:30,849 --> 00:33:32,609 pero que si hacemos un genérico es meter 860 00:33:32,609 --> 00:33:34,569 una clase más y luego hay que instanciar un dao 861 00:33:34,569 --> 00:33:36,150 con el jugador 862 00:33:36,150 --> 00:33:38,690 que sea, jugador videojuego dao 863 00:33:38,690 --> 00:33:38,950 vale 864 00:33:38,950 --> 00:33:42,490 si yo en un dao tengo operaciones 865 00:33:42,490 --> 00:33:44,549 más complejas, ahí lo voy a meter 866 00:33:44,549 --> 00:33:46,490 en el dao, pero en el modo create 867 00:33:46,490 --> 00:33:47,430 o en el modo rotate 868 00:33:47,430 --> 00:33:52,990 get 869 00:33:52,990 --> 00:33:55,849 en esos 870 00:33:55,849 --> 00:33:57,710 al final el end 871 00:33:57,710 --> 00:34:00,650 el entity manager y el DAO genérico 872 00:34:00,650 --> 00:34:01,170 hacen lo mismo 873 00:34:01,170 --> 00:34:04,450 sí, sí, sí, o sea el DAO 874 00:34:04,450 --> 00:34:06,609 lo que hace es el persist, o sea el create 875 00:34:06,609 --> 00:34:08,570 hace persist, el get hace find 876 00:34:08,570 --> 00:34:10,570 sí, sí, sí, pero bueno 877 00:34:10,570 --> 00:34:14,670 depende en qué contexto me hablas 878 00:34:14,670 --> 00:34:16,949 si me hablas en contexto de nosotros en clase 879 00:34:16,949 --> 00:34:18,969 para el examen o me hablas en contexto 880 00:34:18,969 --> 00:34:19,989 del mundo 881 00:34:19,989 --> 00:34:22,969 normalmente en los proyectos amplios 882 00:34:22,969 --> 00:34:24,809 pues el DAO tiene muchos más métodos 883 00:34:24,809 --> 00:34:26,369 que los básicos 884 00:34:26,369 --> 00:34:29,050 tiene métodos de recuperar por otro campo 885 00:34:29,050 --> 00:34:30,250 tiene cosas, entonces 886 00:34:30,250 --> 00:34:31,489 sí que habrá DAO 887 00:34:31,489 --> 00:34:36,690 Claro, que tengas un DAO por cada clase 888 00:34:36,690 --> 00:34:38,329 También, sí 889 00:34:38,329 --> 00:34:42,829 Sí, te refieres 890 00:34:42,829 --> 00:34:44,670 que hacer el genérico queda un poco igual 891 00:34:44,670 --> 00:34:46,829 que puedes, si vas a hacer 892 00:34:46,829 --> 00:34:48,849 un DAO por cada entidad, pues ya 893 00:34:48,849 --> 00:34:50,690 en ese metes lo del genérico 894 00:34:50,690 --> 00:34:51,449 y lo implementas 895 00:34:51,449 --> 00:34:54,690 Sí, sí, yo lo de meter el genérico en el otro 896 00:34:54,690 --> 00:34:56,650 era para que no se os olvidara 897 00:34:56,650 --> 00:34:59,250 para que no se os olvidaran 898 00:34:59,250 --> 00:35:01,130 los tipos de genéricos 899 00:35:01,130 --> 00:35:02,730 como se usan y también 900 00:35:02,730 --> 00:35:04,750 para aprovechar, para meterlo 901 00:35:04,750 --> 00:35:06,809 recordarlo del punto class, pues que es 902 00:35:06,809 --> 00:35:08,730 el punto class que es un 903 00:35:08,730 --> 00:35:10,650 objeto que describe una clase 904 00:35:10,650 --> 00:35:12,650 etcétera, vale 905 00:35:12,650 --> 00:35:14,789 aunque luego efectivamente una vez metido se quedan 906 00:35:14,789 --> 00:35:16,869 cuatro métodos que tienen una línea dentro 907 00:35:16,869 --> 00:35:18,090 cada uno de ellos, vale 908 00:35:18,090 --> 00:35:20,809 vale, vamos a parar un segundín 909 00:35:20,809 --> 00:35:22,050 en