1 00:00:00,940 --> 00:00:23,440 Bueno, pues vamos aquí a crear una clase, vamos a crearnos una clase, la voy a llamar principal, simplemente, principal, simplemente es para probar que esto funciona, voy a crearla como que nos genere un main público ya para que ejecute algo y comprobar que esto funciona, el esquema de todo esto. 2 00:00:23,440 --> 00:00:26,559 bien, pues lo primero que necesito 3 00:00:26,559 --> 00:00:28,579 para trabajar es conectarme 4 00:00:28,579 --> 00:00:30,379 a esa sesión, con lo cual 5 00:00:30,379 --> 00:00:32,259 pues defino mi 6 00:00:32,259 --> 00:00:33,320 session factory 7 00:00:33,320 --> 00:00:37,659 ya empieza a enfadarse, es rápido 8 00:00:37,659 --> 00:00:38,520 para enfadarse 9 00:00:38,520 --> 00:00:42,020 con lo cual voy a seguir trabajando 10 00:00:42,020 --> 00:00:43,600 sf 11 00:00:43,600 --> 00:00:45,859 por ejemplo, le puedo llamar 12 00:00:45,859 --> 00:00:47,340 y le llamo 13 00:00:47,340 --> 00:00:49,240 a section factory 14 00:00:49,240 --> 00:00:50,920 y útil 15 00:00:50,920 --> 00:00:53,240 get 16 00:00:53,240 --> 00:00:54,460 session factory 17 00:00:54,460 --> 00:00:57,200 muy bien 18 00:00:57,200 --> 00:01:01,259 ahora ya se puede importar 19 00:01:01,259 --> 00:01:04,019 de aquí y ya se nos limpia 20 00:01:04,019 --> 00:01:05,799 bueno 21 00:01:05,799 --> 00:01:07,799 voy a abrir una sesión, lo que ya es 22 00:01:07,799 --> 00:01:09,799 una sesión, entonces la sesión 23 00:01:09,799 --> 00:01:11,379 que voy a abrir es esta de aquí 24 00:01:11,379 --> 00:01:13,700 voy a llamarla as directamente como sesión 25 00:01:13,700 --> 00:01:16,180 y voy a llamar 26 00:01:16,180 --> 00:01:17,719 asf open 27 00:01:17,719 --> 00:01:19,120 sesión 28 00:01:19,120 --> 00:01:21,519 ya como saben 29 00:01:21,519 --> 00:01:23,599 si tengo algo 30 00:01:23,599 --> 00:01:25,939 que he creado 31 00:01:25,939 --> 00:01:29,260 por arriba directamente, me vengo abajo y ya la cierro 32 00:01:29,260 --> 00:01:32,879 es la manera de que vaya abriendo y cerrando las cosas, ¿de acuerdo? 33 00:01:34,299 --> 00:01:37,939 vale, voy a generar una transacción, voy a crear una transacción 34 00:01:38,500 --> 00:01:41,239 lo que quiero, para que sepan ustedes lo que quiero hacer 35 00:01:41,239 --> 00:01:46,319 es simplemente crear, añadir un departamento 36 00:01:46,319 --> 00:01:49,900 no voy a hacer nada más de momento, entonces voy a llamar 37 00:01:49,900 --> 00:01:54,060 a mi sesión y voy a comenzar, uy perdón, que he puesto ahí una coma 38 00:01:54,060 --> 00:02:08,780 Voy a comenzar la transacción. Muy bien. Igual que la comienzo, al final de todo tendré que esta transacción, lo que quiero es que se ejecute. Aquí tengo, por tanto, un commit. 39 00:02:08,780 --> 00:02:16,270 no ve el problema cual es 40 00:02:16,270 --> 00:02:17,590 y dice que añada 41 00:02:17,590 --> 00:02:20,389 un casting, no, pues esto es que ha puesto 42 00:02:20,389 --> 00:02:22,229 la transacción mal puesta, de acuerdo 43 00:02:22,229 --> 00:02:24,409 estoy cogiendo el commit que no es 44 00:02:24,409 --> 00:02:26,550 seguramente tiene que ver 45 00:02:26,550 --> 00:02:28,449 con esto, voy a quitar este java x de aquí 46 00:02:28,449 --> 00:02:30,030 arriba para que vean que va a ser otro problema 47 00:02:30,030 --> 00:02:32,389 porque seleccionamos algo que no es lo que 48 00:02:32,389 --> 00:02:34,189 queremos, me voy a ir 49 00:02:34,189 --> 00:02:35,729 a tcommit otra vez 50 00:02:35,729 --> 00:02:37,750 tcommit 51 00:02:37,750 --> 00:02:40,150 y vemos que había hasta uno de 52 00:02:40,150 --> 00:02:42,389 persistencia entity y otro 53 00:02:42,389 --> 00:02:43,889 de transacción, ¿de acuerdo? 54 00:02:44,770 --> 00:02:45,289 Entonces 55 00:02:45,289 --> 00:02:49,969 este de transacción y nos da 56 00:02:49,969 --> 00:02:53,550 problemas, voy a borrar 57 00:02:53,550 --> 00:02:59,669 otra vez, y tenemos 58 00:02:59,669 --> 00:03:01,590 el otro commit que es el 59 00:03:01,590 --> 00:03:03,789 de persistencia, que es el que nosotros queremos 60 00:03:03,789 --> 00:03:05,229 ya vemos que no da ningún problema 61 00:03:05,229 --> 00:03:07,550 ¿vale? Bueno 62 00:03:07,550 --> 00:03:09,569 ¿qué es lo que quiero hacer yo aquí 63 00:03:09,569 --> 00:03:11,689 en medio? Todo esto ha sido para preparar 64 00:03:11,689 --> 00:03:13,729 para que trabaje ya con Ivernet 65 00:03:13,729 --> 00:03:15,610 ¿qué es lo que yo quiero hacer? Pues bueno, lo primero 66 00:03:15,610 --> 00:03:21,629 que yo quiero hacer es crear un departamento. Voy a crear un departamento D, que va a ser 67 00:03:21,629 --> 00:03:33,229 un nuevo departamento, al cual le pongo sus características. Esto se me enfada, no debería 68 00:03:33,229 --> 00:03:41,810 enfadarse, simplemente voy a importar el paquete de clases. Bueno, si yo no recuerdo más el 69 00:03:41,810 --> 00:03:45,909 departamento que lo tengo aquí, tengo dos constructores, uno al que le paso el nombre 70 00:03:45,909 --> 00:03:48,949 y otro que le puedo poner los setes correspondientes. 71 00:03:49,509 --> 00:03:51,650 Así que voy a poner directamente un nombre aquí. 72 00:03:52,430 --> 00:03:56,169 Voy a poner un nombre que sea el departamento de finanzas. 73 00:03:59,099 --> 00:04:02,159 Ahora, una vez que yo tengo este departamento, 74 00:04:02,620 --> 00:04:07,879 yo lo que quiero es salvar la sesión con ese departamento. 75 00:04:07,879 --> 00:04:10,680 O sea, quiero guardar el departamento en la sesión. 76 00:04:11,879 --> 00:04:15,180 Y Santa Pascua ya está. Con esto valdría. 77 00:04:15,180 --> 00:04:34,480 Voy a comprobar primero en la base de datos que no exista. Que no exista ese departamento. Voy al departamento y está en el momento vacío. No hay ninguno. Con lo cual, podría intentar ejecutar este programa. 78 00:04:34,480 --> 00:04:37,019 hay muchas posibilidades de que haya errores 79 00:04:37,019 --> 00:04:39,120 ¿de acuerdo? ahora veremos por qué puede haber 80 00:04:39,120 --> 00:04:39,600 errores 81 00:04:39,600 --> 00:04:42,319 ejecuto 82 00:04:42,319 --> 00:04:45,279 todos estos rojos no son errores, todos estos primeros 83 00:04:45,279 --> 00:04:46,259 no son errores 84 00:04:46,259 --> 00:04:49,180 voy a ampliar la consola 85 00:04:49,180 --> 00:04:50,040 para que la vean 86 00:04:50,040 --> 00:04:53,079 entonces, bueno, pues echamos un augeado 87 00:04:53,079 --> 00:04:55,279 y efectivamente no hay ningún error 88 00:04:55,279 --> 00:04:57,120 todos estos son avisos del propio 89 00:04:57,120 --> 00:04:59,220 Avernight, después en otro 90 00:04:59,220 --> 00:05:00,939 vídeo les contaré cómo quitar esto 91 00:05:00,939 --> 00:05:02,060 y 92 00:05:02,060 --> 00:05:10,420 Y no ha dado ningún error, simplemente ha debido de generar nuestro departamento. 93 00:05:10,420 --> 00:05:18,019 Voy a comprobarlo, me vuelvo aquí y voy a volver a examinar nuestro proyecto. 94 00:05:22,209 --> 00:05:27,730 Y no nos ha creado más que este que aparece finanzas, ¿de acuerdo? 95 00:05:27,730 --> 00:05:39,269 en la tabla de departamento, examinar, y efectivamente nos ha generado un identificador 1 y nombre finanzas, justo el que nosotros habíamos intentado. 96 00:05:39,870 --> 00:05:54,819 Si yo volviera a ejecutar el programa, algo que les recomiendo que hagan siempre para que se comprueben las cosas, ahora sí que han aparecido muchos errores. 97 00:05:57,519 --> 00:06:02,480 Entonces, a partir de aquí, que fueron las informaciones que había, hay que empezar a ver los errores. 98 00:06:02,480 --> 00:06:21,220 Y lo que nos dice es algo muy simple. Dice que la entrada a finanzas está duplicada porque hay una clave única en ese campo. Y efectivamente ese es el problema que da. Con lo cual, simplemente ya sabemos que lo que tenemos que hacer es ir buscando nuestras excepciones e irlas tratando. 99 00:06:26,579 --> 00:06:29,459 Nosotros sabemos que esto nos ha generado una excepción. 100 00:06:29,660 --> 00:06:31,379 Podemos tratarla. Vamos a tratarla. 101 00:06:31,939 --> 00:06:33,180 Con lo cual me voy a ir a la consola. 102 00:06:33,439 --> 00:06:39,319 Voy a buscar cómo se llamaba esta excepción, que es esta de aquí. 103 00:06:40,319 --> 00:06:43,120 Con lo cual voy a copiarla para que no se me olvide su nombre. 104 00:06:43,120 --> 00:06:44,019 Control-C. 105 00:06:44,740 --> 00:06:52,139 Y, perdón, me vengo aquí al código y voy a tratar la excepción. 106 00:06:53,459 --> 00:06:59,360 Entonces yo podría utilizar un bloque try. 107 00:06:59,699 --> 00:07:30,589 Y aquí ver de esta excepción que aparece genérica, poner esta de aquí, ¿vale? El save que tengo aquí lo meto al try para que lo intente hacer. Voy a cargar, a importar las excepciones de hibernate y aquí puedo poner perfectamente pues algo así como clave duplicada, algo así, ¿vale? 108 00:07:31,589 --> 00:07:34,449 Bueno, voy a ejecutar esto de aquí. 109 00:07:36,050 --> 00:07:40,569 Voy a ejecutar esto de aquí, voy a guardarlo y voy a ejecutarlo. 110 00:07:44,519 --> 00:07:47,740 Bueno, voy a ver mientras la consola completa para ver los errores. 111 00:07:47,939 --> 00:07:53,699 Y vemos que me encuentro otros errores distintos, que no han sido tratados en esa excepción. 112 00:07:54,519 --> 00:07:58,480 Y veo que tienen que ver con las transacciones, ¿de acuerdo? Con las transacciones. 113 00:07:58,480 --> 00:08:03,639 Así que vamos a intentar hacer lo que realmente significa una transacción. 114 00:08:03,759 --> 00:08:25,939 Yo voy a intentar hacer la transacción y si no puedo, voy a hacer un commit, lo que voy a hacer es un rollback. Si uno va al API de Hibernate, por lo que ve es una estructura como esta, donde intenta meter el bloque aquí dentro y si no lo deshace. 115 00:08:25,939 --> 00:08:29,600 ¿De acuerdo? Pues vamos a intentar hacer este bloque de aquí. 116 00:08:29,740 --> 00:08:31,879 Vamos a meter la transacción de esta manera. 117 00:08:32,860 --> 00:08:43,200 Voy a generar aquí un bloque try, catch, 118 00:08:44,019 --> 00:08:46,860 o un try, catch, finally. 119 00:08:47,460 --> 00:08:48,379 Ahí, bueno, vale. 120 00:08:50,000 --> 00:08:51,000 Lo mismo me da. 121 00:08:51,879 --> 00:08:55,860 Dentro de ese try, lo primero que vamos a hacer es cargar 122 00:08:55,860 --> 00:08:58,600 la transacción 123 00:08:58,600 --> 00:09:01,159 tengo el virus del dedo 124 00:09:01,159 --> 00:09:04,110 vale, bueno 125 00:09:04,110 --> 00:09:06,830 ahí estamos, esto lo defino 126 00:09:06,830 --> 00:09:08,649 aquí, quitando todo esto 127 00:09:08,649 --> 00:09:11,750 dentro 128 00:09:11,750 --> 00:09:14,769 de esa transacción es donde voy a intentar 129 00:09:14,769 --> 00:09:16,529 cargar 130 00:09:16,529 --> 00:09:17,389 esto de aquí 131 00:09:17,389 --> 00:09:18,970 ¿de acuerdo? 132 00:09:20,309 --> 00:09:22,409 y siguiendo este esquema 133 00:09:22,409 --> 00:09:24,769 voy a coger una excepción 134 00:09:24,769 --> 00:09:26,610 cualquiera que se nos quede por aquí 135 00:09:26,610 --> 00:09:30,720 voy a intentar 136 00:09:30,720 --> 00:09:33,980 Pon esto por aquí 137 00:09:33,980 --> 00:09:37,080 En vez de esto que tengo aquí 138 00:09:37,080 --> 00:09:41,320 Vamos a colocar las cosas 139 00:09:41,320 --> 00:09:45,559 Como hay que colocarlas 140 00:09:45,559 --> 00:09:47,139 Aquí tengo mi catch 141 00:09:47,139 --> 00:09:52,220 Las transacciones en este ejemplo las ponía con un nombre 142 00:09:52,220 --> 00:09:58,360 Con el nombre tx, pero yo tengo el nombre t 143 00:09:58,360 --> 00:10:00,320 Si es distinto de nulo 144 00:10:00,320 --> 00:10:04,519 pues voy a hacer un rollback 145 00:10:04,519 --> 00:10:06,519 y voy 146 00:10:06,519 --> 00:10:12,679 a lanzar esa excepción hacia el exterior para que alguien la recoja 147 00:10:12,679 --> 00:10:15,399 y finalmente, si todo ha ido bien 148 00:10:15,399 --> 00:10:19,840 pues voy a coger mi sesión y la voy a cerrar 149 00:10:19,840 --> 00:10:22,360 ¿de acuerdo? esto que estoy haciendo aquí 150 00:10:22,360 --> 00:10:27,399 el tcomit lo haría aquí dentro 151 00:10:27,399 --> 00:10:34,830 y en el esquema que él me utiliza 152 00:10:34,830 --> 00:10:40,879 esto estaría aquí 153 00:10:40,879 --> 00:10:43,000 ¿de acuerdo? 154 00:10:47,139 --> 00:10:49,480 veo aquí un par de problemas 155 00:10:49,480 --> 00:10:51,039 que voy a ver de qué son 156 00:10:51,039 --> 00:10:53,399 esta variable no ha sido inicializada 157 00:10:53,399 --> 00:10:56,220 entonces voy a inicializar transaction anul 158 00:10:56,220 --> 00:11:02,570 para que ya todo esté funcionando 159 00:11:02,570 --> 00:11:04,509 el esquema es el mismo de antes 160 00:11:04,509 --> 00:11:05,909 aquí tengo el bloque de salvar 161 00:11:05,909 --> 00:11:08,409 que me diga si la clave es duplicada o no 162 00:11:08,409 --> 00:11:09,750 o me debería decir algo así 163 00:11:09,750 --> 00:11:12,669 pero lo más importante es si hago el commit o no lo hago 164 00:11:12,669 --> 00:11:14,690 vamos a ver si esto me dice algo 165 00:11:14,690 --> 00:11:16,549 ejecuto 166 00:11:16,549 --> 00:11:17,730 y voy a ir a la consola 167 00:11:17,730 --> 00:11:22,600 y yo sinceramente 168 00:11:22,600 --> 00:11:24,179 veo que el problema que me da 169 00:11:24,179 --> 00:11:26,659 me sigue dando el mismo 170 00:11:26,659 --> 00:11:29,059 me ha dicho clave duplicada 171 00:11:29,059 --> 00:11:30,440 el mensaje que yo puse 172 00:11:30,440 --> 00:11:32,919 está ahí, hasta ahí está perfecto 173 00:11:32,919 --> 00:11:34,320 y a partir de ahí 174 00:11:34,320 --> 00:11:36,360 este error me está dando 175 00:11:36,360 --> 00:11:37,179 el mismo 176 00:11:37,179 --> 00:11:40,279 me dice aquí que en excepción 177 00:11:40,279 --> 00:11:42,779 en el bloque que es este de Assertion Failure 178 00:11:42,779 --> 00:11:48,480 que dice que no puede 179 00:11:48,480 --> 00:11:50,500 guardar, que no puede realizar 180 00:11:50,500 --> 00:11:53,480 esta sesión, de acuerdo 181 00:11:53,480 --> 00:11:56,519 yo he seguido este esquema al pie de la letra 182 00:11:56,519 --> 00:12:00,000 y realmente no veo 183 00:12:00,000 --> 00:12:03,720 por donde van los tiros 184 00:12:03,720 --> 00:12:07,919 los tiros los he visto en el momento que 185 00:12:07,919 --> 00:12:10,639 lo he mirado rápidamente, aquí estoy lanzando 186 00:12:10,639 --> 00:12:12,740 la excepción, con lo cual otra vez se me muestra 187 00:12:12,740 --> 00:12:14,659 si yo simplemente quito esta línea 188 00:12:14,659 --> 00:12:16,539 o simplemente voy a comentarla 189 00:12:16,539 --> 00:12:17,639 para que no se ejecute 190 00:12:17,639 --> 00:12:20,580 pues directamente 191 00:12:20,580 --> 00:12:22,779 vemos que en la consola 192 00:12:22,779 --> 00:12:25,039 me aparecen estos errores 193 00:12:25,039 --> 00:12:26,919 para indicar cosas de Ibernate 194 00:12:26,919 --> 00:12:28,759 propias de Ibernate, pero ya 195 00:12:28,759 --> 00:12:30,399 no se me para el programa, el programa 196 00:12:30,399 --> 00:12:32,240 seguiría ejecutando, de acuerdo 197 00:12:32,240 --> 00:12:34,720 me cuenta las cuestiones, pero no 198 00:12:34,720 --> 00:12:36,779 me cuenta nada más, así que 199 00:12:36,779 --> 00:12:38,799 vuelvo al código 200 00:12:38,799 --> 00:12:41,279 este sería nuestro esquema de trabajo 201 00:12:41,279 --> 00:12:44,480 en un bloque try arrancamos nuestra transacción 202 00:12:44,480 --> 00:12:50,460 ponemos lo que tengamos que hacer con nuestra aplicación 203 00:12:50,460 --> 00:12:54,539 e intentamos que lo haga, que realmente lo ejecute 204 00:12:54,539 --> 00:12:57,519 si hay algún problema hacemos un rollback 205 00:12:57,519 --> 00:13:01,559 y finalmente, siempre en todo caso, cerramos nuestra sesión 206 00:13:01,559 --> 00:13:05,120 espero que todo este vídeo les haya servido 207 00:13:05,120 --> 00:13:08,919 para entender cómo funciona una parte de Ivernate. 208 00:13:09,519 --> 00:13:15,139 Quiero volver a la parte teórica porque nos hemos perdido en tantos detalles de implementación 209 00:13:15,139 --> 00:13:18,820 que no vemos la parte teórica. 210 00:13:18,820 --> 00:13:26,440 En este momento nosotros estamos guardando un departamento sin decir nada de insert, into, 211 00:13:26,820 --> 00:13:28,779 es decir, sin utilizar SQL para nada. 212 00:13:28,779 --> 00:13:37,139 Directamente es la máquina ORM la que carga un objeto y la convierte a la base de datos 213 00:13:37,139 --> 00:13:43,779 En este caso relacional, la base de datos relacional, guardándola sin hacer nosotros ninguna sentencia SQL 214 00:13:43,779 --> 00:13:48,159 Esto nos va a garantizar hacer ese mapeo objeto relacional 215 00:13:48,159 --> 00:13:51,519 Convertir un objeto en relaciones y viceversa 216 00:13:51,519 --> 00:13:57,500 En otros ejemplos veremos ahora cómo obtener las relaciones de las tablas y convertirlas a objetos 217 00:13:58,779 --> 00:13:58,879 CC por Antarctica Films Argentina