Ejercicios de la UD11¶
Actividades¶
Definición de clases mediante ODL¶
El objetivo de esta actividad es ver cómo especificar clases usando el lenguaje ODL.
Genere la declaración ODL de las clases del diagrama siguiente:

Solución¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
Instalación y uso de db4o¶
El objetivo de esta actividad es ver cómo usar las librerías de db4o para trabajar con BDOO mediante su IDE.
Vaya a la página de db4o y descargue sus bibliotecas y la documentación. Lea la documentación para ver cómo puede utilizar las bibliotecas para generar programas mediante su IDE. Una vez hecho, ejecute el siguiente código para ver que todo está correcto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | |
Gestión de grupos de trabajo de estudiantes mediante db4o¶
El objetivo de esta actividad es ver cómo gestionar la persistencia de objetos usando la BDOO db4o.
Se dispone de las dos clases Estudiant y GrupTreball, cuyo código se muestra a continuación. A partir de este código, se desea crear una aplicación que, mediante una BDOO db4o gestione a qué grupos de trabajo pertenecen diferentes estudiantes dentro de una escuela. Dado un grupo de trabajo, éste puede tener asignados varios estudiantes, pero todo estudiante sólo tiene un (pero siempre uno) único grupo de trabajo. La aplicación debe poder hacer lo siguiente:
- Dar de alta a un nuevo estudiante. A la hora de asignarle un grupo, si el nombre indicado no existe, se crea un grupo nuevo. Si existe, al estudiante se le asigna ese grupo.
- Reasignar un estudiante a otro grupo de trabajo. Este grupo ya debe existir. Si, al hacerlo, el grupo antiguo queda sin miembros, debe borrarse de la BDOO.
- Listar a todos los grupos existentes.
- Listar a todos los estudiantes (ya qué grupo pertenecen).
Se considera que los nombres de los grupos y estudiantes son únicos en el sistema. No puede haber nombres repetidos. En base a la descripción, también hay que remarcar que la única forma de crear grupos nuevos es añadiendo nuevos estudiantes.
Para realizar esta tarea, el código fuente de estas dos clases no puede modificarse en absoluto.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | |
Solución¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | |
Gestión de clientes y encargos mediante db4o¶
El objetivo de esta actividad es ver cómo gestionar la persistencia de objetos usando la BDOO db4o.
Haga un programa que gestione los objetos de una base de datos de clientes de acuerdo al siguiente diagrama:
El programa debe poder dar las siguientes opciones:
- Añadir un nuevo tipo de producto.
- Añadir un nuevo cliente.
- Añadir un nuevo encargo a un cliente; el encargo puede contener más de un tipo de producto asociado.
- Listar todos los tipos de producto en el sistema.
- Listar los datos de un cliente y todos sus encargos hasta ahora.
Los tipos de producto y los clientes se identifican de forma única por el nombre (sólo puede haber un único objeto con un nombre dado). Para este ejercicio no es necesario gestionar la persistencia de actualizaciones entre diferentes ejecuciones.
Solución¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Instalación y uso de JDO¶
El objetivo de esta actividad es ver cómo usar una BDDOO basada en JDO mediante su IDE.
Vaya a la página de BDOO JDOInstruments y descargue sus bibliotecas y la documentación. Lea la documentación para ver cómo puede utilizar las bibliotecas para generar programas mediante su IDE. Una vez hecho, ejecute correctamente el ejemplo proporcionado con las librerías (en la carpeta “linuxexample” o “windiowsexample”, según su sistema operativo).
Ejercicios¶
Ejercicio 1¶
A partir del siguiente fragmento de ODL, que describe en términos generales un juego donde jugadores se desplazan por un laberinto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Marque si son verdaderas (V) o falsas (F) las siguientes opciones. Siguiendo estrictamente las definiciones…
| Núm | Pregunta | V | F |
|---|---|---|---|
| 1 | Un jugador puede tener varios elementos con el mismo nombre. | f | |
| 2 | Un jugador puede tener varios ítems con el mismo peso. | v | |
| 3 | Una sala puede tener distintas salidas con el mismo nombre. | f | |
| 4 | Una salida puede ir a parar a varias salas, pero nunca repetidas. | f | |
| 5 | En el programa puede haber salas con el mismo nombre. | v | |
| 6 | En el programa puede haber salas con la misma descripción. | v | |
| 7 | En el programa puede haber jugadores con el mismo nombre. | v | |
| 8 | En el programa puede haber jugadores con un mismo ítem. | v | |
| 9 | En el programa puede haber jugadores con la misma ubicación. | v | |
| 10 | No puede haber ningún ítem en ninguna sala. | v |
Ejercicio 2¶
Dada la consulta OQL siguiente:
1 2 3 | |
Elija la opción correcta. Si se desea obtener estrictamente los mismos datos resultantes…
| Núm | Pregunta | |
|---|---|---|
| 1 | En una BDOO db4o, es posible hacerlo usando una búsqueda por ejemplo. | |
| 2 | En una BDOO db4o, es posible hacerlo usando una búsqueda nativa. | |
| 3 | En una BDOO basada en JDO, es posible hacerlo usando una búsqueda query.execute(…). | |
| 4 | Ninguna de las anteriores afirmaciones es cierta. | esta |
Ejercicio 3¶
Se dispone de la siguiente clase, cuyos objetos están almacenados en una BDOO db4o. Para gestionarlos, sólo se desea utilizar búsquedas por ejemplo (Queries-By-Example).
1 2 3 4 5 6 7 | |
Marque si son verdaderas (V) o falsas (F) las siguientes opciones:
| Núm | Pregunta | V | F |
|---|---|---|---|
| 1 | Es posible buscar la asignatura que tiene un nombre concreto. | f | |
| 2 | Es posible buscar las asignaturas con una temática concreta. | v | |
| 3 | Es posible buscar las asignaturas de seis créditos. | v | |
| 4 | Es posible buscar la asignatura con menos créditos. | f | |
| 5 | Es posible buscar las asignaturas que nunca se han abierto. | f | |
| 6 | Es posible buscar las asignaturas abiertas al menos una vez. | f | |
| 7 | Es posible buscar la asignatura con más estudiantes en la actualidad. | f | |
| 8 | Es posible buscar las asignaturas sin estudiantes en la actualidad. | f |
Ejercicio 4¶
Complete las afirmaciones con la palabra que considere más adecuada:
| Núm | Pregunta | Respuesta |
|---|---|---|
| 1 | Al abrir una BDOO db4o se obtiene un… |
| 2 | Al abrir una BDOO JDO se obtiene un… | |
|---|---|---|
| 3 | Para realizar búsquedas simples en una BDOO db4o se usa el método… | |
| 4 | Para realizar búsquedas complejas en una BDOO db4o se usa el método… | |
| 5 | Para realizar búsquedas en una BDOO JDO se usa el método… | |
| 6 | Para almacenar objetos en una BDOO db4o se usa el método… | |
| 7 | Para almacenar objetos en una BDOO JDO se usa el método… |
Ejercicio 5¶
Dado el siguiente diagrama de clases y fragmento de código de una BDOO db4o:
Figura
1 2 3 4 5 6 7 8 9 10 11 | |
Elija la opción correcta:
| Núm | Pregunta | |
|---|---|---|
| 1 | Este código es correcto y no crea ninguna inconsistencia en BDOO. | |
| 2 | Este código es incorrecto; siempre habrá inconsistencias en la BDOO. | |
| 3 | Este código es incorrecto, pero no siempre creará inconsistencias en BDOO. | ESTA |
| 4 | Este código es redundante, ya que no es necesario el bucle. |
Ejercicios propuestos¶
- Investiga la sintaxis de uso de la API Criteria y propón algún ejemplo.
- ¿Es posible mezclar parámetros por nombre y parámetros posicionales en una query?
- Investiga sobre el marcado de clases con la etiqueta @Mapped. ¿Qué significado tiene?
- ¿Para qué se utilizan los scripts enhancer.bat y enhancer.sh?
- Indica qué significado tiene marcar un campo persistente con alguna de las siguientes marcas: @OneToO0ne, @ManyToOne, @OnetoMany, @ManyToMany, Basic. Propón ejemplos ilustrativos.
Supuestos prácticos¶
-
Se necesita implementar un programa que administre la información de los vehículos y personas que los conducen cuando entran en un recinto privado. De los vehículos se desea almacenar su identificador (número entero), la matrícula (cadena de caracteres), la fecha de matriculación (fecha) y la persona que lo conduce (clase persona). De los vehículos que sean coches, además, se desea almacenar el tipo de energía que lo propulsa (enumerado: GASOLINA, DIÉSEL, ELÉCTRICO, HÍBRIDO). De las personas que conducen los vehículos se desea almacenar su nombre (cadena de caracteres) y su DNI (cadena de caracteres). De aquellas personas que además sean trabajadores se desea almacenar su número de registro personal (número entero). Implementa las clases entidad que permitan manejar y volcar esta información a una base de datos denominada control, así como un programa que añada los datos de 4 vehículos (2 de ellos coches) y 4 conductores (2 de ellos trabajadores). Utiliza el explorador ObJjectDB Explorer para comprobar que se han introducido correctamente.
-
Sobre el supuesto práctico anterior, añade al programa principal un menú que ofrezca al usuario la posibilidad de dar de alta nuevos vehículos y personas, consultar los datos de los vehículos almacenados en el sistema, modificar los mismos datos y eliminar los datos de determinados vehículos, incluidos coches, a partir de su identificador.
-
Crea un programa que permita migrar los datos de los trabajadores de una empresa contenidos en un fichero de texto a una base de datos ObjectDB. Los campos contenidos en el fichero de texto vienen separados por el carácter 4 y son los siguientes: DNI, Apellido1, Apellido2, Nombre, FechaNacimiento, Fechalncorporación, Puesto. Selecciona el tipo de dato persistente que mejor se adapte a la información a almacenar.
-
A partir de la base de datos del supuesto práctico anterior, escribe un programa que permita recuperar los datos de los trabajadores según determinados parámetros que serán introducidos por teclado conforme a la opción elegida en un menú de opciones. El menú constará de 3 opciones:
- “Filtrar mayores de edad”: Devolverá únicamente los datos de los trabajadores de más de 18 años a fecha actual.
- “Filtrar por DNI igual a...”: Devolverá únicamente los datos del trabajador cuyo DNI coincida con el leído.
- “Filtrar por antigúedad mayor a...”: Devolverá los datos de los trabajadores cuya antigúedad en el puesto sea superior a la leída por teclado.
Emplea @NamedQuery para una de ellas y querys dinámicas con parámetros por nombre para las otras dos.
- Modifica el programa del supuesto práctico anterior para que añada la opción “Alta trabajador” al menú y permita leer los datos desde teclado para almacenarlos en la base de datos.
Auto evaluación¶
- ¿Cuál de las siguientes no es una declaración de tipo persistente?
a) java.sql.Date fecha.
b) @Temporal(TemporalType.DATE) java.util.Date fecha.
c) @Temporal(TemporalType.DATE) java.util.Calendar fecha.
d) Todas las opciones anteriores son declaraciones de tipo persistente.
- ¿Cuál de los siguientes no es un requisito de una clase entidad?
a) Tener un constructor parametrizado.
b) Sus campos deben ser privados.
c) Sus propiedades deben ser accesibles mediante métodos get y set que siguen una convención de nomenclatura estándar.
d) Ser serializable.
- ¿Cómo debe marcarse el campo de una clase entidad cuyo tipo sea una clase definida por el programador y del que no se desea que sea almacenado como clase entidad?
a) @Embedded.
b) @Embeddable.
c) @Serializable,
d) @Entity
- De las siguientes estrategias de generación de clave primaria, ¿cuál es equivalente a
@GeneratedValue?
a) Omitir la marca es la equivalencia.
b) @GeneratedValue(strategy=GenerationType.IDENTITY).
c) @GeneratedValue(strategy=GenerationType.AUTO).
d) @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq").
- ¿En qué parte de una sentencia SELECT se pueden emplear las funciones agregadas? a) SELECT.
b) FROM.
c) AS.
d) Todas las opciones son correctas.
- ¿Cuál de los siguientes métodos propaga los cambios a la base de datos? a)
persist.
b) begin.
c) rollback.
d) commit.
- ¿Cuál de las siguientes query utiliza parámetros posicionales de forma correcta? a)
em.createQuery("SELECT e FROM Compra c WHERE p.precio = *1").
b) em.createQuery("SELECT € FROM Compra c WFIERE p.precio =? 1").
c) em.createQuery("SELECT e FROM Compra c WHERE p.precio = '*1'").
d) em.createQuery(“SELECT € FROM Compra c WHERE p.precio = '?1'”).
- ¿Qué operación del conjunto de operaciones CRUD no necesita de un commit? a) C (Create).
b) R (Read).
c) U (Update).
d) D (Delete).
- ¿Cuál de las siguientes no es una opción válida para establecer la ruta de la base de datos?
a) Utilizar la variable $objectdb.
b) Utilizar directamente el path de la base de datos (“C:\ ...”).
c) Utilizar una URL.
d) Todas las opciones anteriores son válidas para establecer la ruta de la base de datos.
-
¿Qué métodos permiten establecer los cambios que se ejecutan como una transacción?
a)
em.getTransaction().begin(); yem.getTransaction().end(). b)em.getTransaction().start(); yem.getTransaction().end(). c)em.getTransaction().begin(); yem.getTransaction().commit(). d)em.getTransaction().start(); yem.getTransaction().commit().
