Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Relacion uno a uno

Estas en el tema de Relacion uno a uno en el foro de Bases de Datos General en Foros del Web. hola a todos. Estoy trabajando en eclipse, java, haciendo una base de datos, (con postgres) y se me presento un problema en las relaciones uno ...
  #1 (permalink)  
Antiguo 05/08/2011, 14:03
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Relacion uno a uno

hola a todos.

Estoy trabajando en eclipse, java, haciendo una base de datos, (con postgres) y se me presento un problema en las relaciones uno a uno he intentado varias cosas. Acontinuacion esta como lo tengo en el codigo
Código:
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
en la clase usuario y en la clase caballero se mapea por la referencia de caballero e usuario

Código:
@OneToOne(mappedBy = "caballero")
en realidad lo que deseo es que un usurio puede tener un caballero y un caballero puede pertenecer a un usuario pero no puede existir u caballero q no este relacionado con un usuario mas si puede haber un usuario que no tenga caballero.

y entonces me sale este error

Código:
GRAVE: Batch entry 0 insert into t_caballero (ataque, defensa, idRef_tipo, modeloCaballeroRef_id, nivel, oro, vida, id) values (0, 0, NULL, NULL, 0, 0, 0, 23) was aborted.  Call getNextException to see the cause.
02/08/2011 11:15:34 AM org.slf4j.impl.JCLLoggerAdapter warn
ADVERTENCIA: SQL Error: 0, SQLState: 23503
02/08/2011 11:15:34 AM org.slf4j.impl.JCLLoggerAdapter error
GRAVE: ERROR: insert or update on table "t_caballero" violates foreign key constraint "fkbd7836da62e04e7d"
  Detail: Key (id)=(23) is not present in table "t_usuario".
pienso que es una tonteria pero honestamente no lo veo y estoy algo estacanda por este error....

porfis una ayudita
  #2 (permalink)  
Antiguo 05/08/2011, 16:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Relacion uno a uno

El problema puede estar a nivel de diseño, porque una relación 1:1 implica que la PK de una de las dos tablas debe ser FK en la otra. En principio, no hay nada que determine cuál en cual, sólo se pide que una de las dos sea FK de la otra, pero sólo una de las tablas contiene la FK, la otra no.
Esto es así porque no se debe crear una dependencia recíproca que es imposible de cumplir. Si pones cada PK como FK de la otra tabla, jamás podrás insertar nada, porque en ese caso para que un usuario se pueda insertar debería existir primero el caballero, pero eso sería imposible porque para insertar el caballero se requeriría el usuario.
¿Se entiende le problema lógico?
La forma de determinar cuál es la PK que va como FK es simple: ¿Cuál de las dos cosas debe existir si o sí al iniciar el sistema?
Simple: El usuario.
Es imposible que un sistema exista sin usuarios, por lo qe si es lo primero que comienza a existir en el sistema, entonces el caballero depende de él, y la PK del usuario va como FK en la tabla de caballero.
Y esto es más allá de si usas Postgre, SQL Server o lo que sea: Es diseño de bases de datos.

Verifica que esta sea la situación.
Si así está diseñado todo, entonces asegúrate de que el valor que estás poniendo en la FK de Caballero exista previamente en Usuario.
El resto es asunto de programación y eso no se trata en este foro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 06/08/2011, 11:07
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Relacion uno a uno

si asi mismo es como lo estamos haciendo de hecho cuando lo corremos en mysql funciona bien, el rollo me lo esta dando postgres y ese es en el que necesito utilizar, claro obviamente el usuario no puede depender del caballero, si no al contrario.

pero como funciona con mysql entonces no se que es lo qeu tengo mal.... ves???
  #4 (permalink)  
Antiguo 06/08/2011, 13:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Relacion uno a uno

En realidad el problema es que no estás leyendo lo que dice el mensaje:
Cita:
Detail: Key (id)=(23) is not present in table "t_usuario".
En otras palabras, como te comenté, estás tratando de poner en Caballero, un valor de FK que no existe en la tabla de usuarios.
Verifica lo que estás intentando poner.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/08/2011, 07:42
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Relacion uno a uno

sip ya logramos resolver ese ere el problema, muchas gracias.... XD
  #6 (permalink)  
Antiguo 07/08/2011, 08:21
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Relacion uno a uno

Disculpa pero voy a abusar de ti, sabes q necesito eliminar un registro no, pero cuando lo hago me da un error me dice q no existe la relacion, pero alli en la base datos esta y yo he guardado registros , pero entonces yo le digo asi: (puede q me este faltando algo clave y por eso sea el error??)

Código:
 
               Session session = SessionHibernate.getInstance().openSession();
		session.beginTransaction();

		String queryStr = "DELETE FROM CoordenadaArma WHERE id = :id";
		Query query = session.createSQLQuery(queryStr);
		query.setInteger("id", armaT.getId());
		query.executeUpdate();

		session.getTransaction().commit();
		session.close();
  #7 (permalink)  
Antiguo 07/08/2011, 09:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Relacion uno a uno

Esos dos puntos (:) delante del valor a buscar, a menos que sea la forma de escribit un parámetro, te están generando un error.
Normalmente en los lenguajes de programación, cuando usas MySQL, en la consulta los parámetros se escriben con un prefijo "@" o "?", pero no con ":".
Verifica eso. SI no es eso, veremo smás fino.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: bd, relacion, sql, bases-de-datos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:14.