Foros del Web » Programación para mayores de 30 ;) » Java »

Hibernate (Editar clave foranea)

Estas en el tema de Hibernate (Editar clave foranea) en el foro de Java en Foros del Web. Hola a todos, me estoy metiendo con Hibernate y me encuentro con lo siguiente: -> ¿Cómo editar una clave foranea? Hago uso de un ejemplo ...
  #1 (permalink)  
Antiguo 12/04/2012, 02:56
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Hibernate (Editar clave foranea)

Hola a todos,
me estoy metiendo con Hibernate y me encuentro con lo siguiente:

-> ¿Cómo editar una clave foranea?

Hago uso de un ejemplo de internet para que quede más claro:

Tabla address:
Código MySQL:
Ver original
  1. create table address(
  2.     address_id int(11) not null auto_increment,
  3.     address_line1 varchar(100) not null,
  4.     address_line2 varchar(100),
  5.     city varchar(50) not null,
  6.     state varchar(50) not null,
  7.     pincode int(10) not null,
  8.     primary key(address_id));

Tabla customer:
Código MySQL:
Ver original
  1. create table customer(
  2.     customer_id int(11) not null auto_increment,
  3.     name varchar(50) not null,
  4.     email_id varchar(100),
  5.     contact_no varchar(20),
  6.     address_id int(11),
  7.     primary key(customer_id),
  8.     foreign key(address_id) references address(address_id));

La clase Adress:
Código Java:
Ver original
  1. public class Address {
  2.  
  3.  long addressId;
  4.  String addressLine1;
  5.  String addressLine2;
  6.  String city;
  7.  String state;
  8.  Integer pincode;
  9.  Customer customer;

La Clase Customer:

Código Java:
Ver original
  1. public class Customer {
  2.  Long customerId;
  3.     String name;
  4.     String emailAddress;
  5.     String contactNo;
  6.     Address address;

El Mapeo es:

Customer.hbm.xml
Código XML:
Ver original
  1. <many-to-one name=”address”  column=”address_id”
  2.                cascade=”all”  unique=”true”
  3.    />

Mi problema y pregunta:
La clave foranea de la tabla Customer llamada "address_id", no tengo acceso a ella mediante ningún atributo de la Clase "Customer", ya que ésta solo tiene el objeto al que hace referencia a la tabla Adress.

Si quiero modificar la clave foranea "adress_id" de la tabla Customer, como puedo dirigirme a ella?

He visto en numerosos ejemplos que todos están hechos de la misma manera, y editan varios campos, pero nunca éste, y puede darse el caso de NECESITARLO.

Si alguien me puede ayudar/orientar se lo agradecería mucho.

Un saludo.
  #2 (permalink)  
Antiguo 12/04/2012, 03:10
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Hibernate (Editar clave foranea)

No entiendo muy bien qué es lo que pretendes hacer, pero no se yo si está bien referenciado desde customer:

El fecth es la forma de acceder: select, join, etc... puedes pasar de ella
class es la ruta completa de la clase: ruta package + Clase

<many-to-one name="adress" class="tu.package.donde.esta.Address" fetch="select">
<column name="address_id" not-null="true">
<comment>Puedes agregar un comentario sobre la columna.</comment>
</column>
</many-to-one>

Para modificar la clave puedes seleccionar otra columna :/
Si a lo que te refieres es a alterar el valor de la clave deberias hacerlo directamente desde adress y teniendo en cuenta que son claves únicas (esto es más peligroso que lo primero)
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 12/04/2012, 04:15
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Respuesta: Hibernate (Editar clave foranea)

Hola Fuzzylog,
Supongo que debe estar mal el planteamiento.....

Según el ejemplo del POST, la tabla Customer tiene una clave foranea llamada "address_id" que pertenece a la tabla Address columna "address_id".

Es posible necesitar cambiar el valor de la clave foranea de la tabla Customer llamada "address_id" por otro valor de exista en la tabla Adrress de la columna "address_id".

Si al campo "address_id" (foranea) de Customer no lo tengo como atributo en la Clase Customer, y por lo tanto no está mapeado, como poder acceder y cambiar su valor?

Es algo lioso, sumado a que estoy recien metido en Hibernate puede que mi explicación no sea la más acertada.

Gracias y un saludo.
  #4 (permalink)  
Antiguo 12/04/2012, 04:22
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Respuesta: Hibernate (Editar clave foranea)

Decididamente creo que está mal planteado y debe ser la Clase que contenga la clave foranea la que debe guardar el Objeto. Traslandando la problemática a un escenario con 3 Tablas lo veo de esta manera.

Antes de liarme y liaros más a vosotros, voy definir esto último y probar....

Gracias a todos y un saludo.
  #5 (permalink)  
Antiguo 12/04/2012, 06:02
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Hibernate (Editar clave foranea)

Hablando en plata... Si tienes que actualizar una dirección lo que tienes que cambiar es el objeto de la clase Adress, pero no hace falta modificar la ID.

Ejemplo:
Address ID 2 ; DIRECCION: Plaza Concordia S/N
Resulta que le cambian el nombre a la plaza, pues lo que tiene que cambiar es:
Agress ID 2 ; DIRECCION: Plaza Discordia S/N

Si lo que tienes es un Cliente que vive en un sitio y se cambia a otro, lo que tienes es que modificar el campo ADRESS_ID del Customer asignandole el ID del nuevo Adress.

Si está bien mapeado en hibernate... dentro del customer tienes el objeto adress completo y puedes recuperar sus datos.

Pero cuando va a guardar en BD el customer con el address modificado, lo que hace es solo guardar LA ID del nuevo address en la columna propia del customer, es decir, modificas el valor de la clave foranea de CUSTOMER, no el valor de la clave primaria de ADRESS (esa no se toca).
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #6 (permalink)  
Antiguo 12/04/2012, 07:34
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Respuesta: Hibernate (Editar clave foranea)

Hola Fuzzylog,
lo que comentas lo entiendo perfectamente. Mi duda surgia principalmente de un mal planteamiento.

Lo veo claro.

Gracias y un saludo.

Etiquetas: clase, clave, hibernate, string
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 08:56.