Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/02/2012, 10:10
Selva123
 
Fecha de Ingreso: febrero-2012
Mensajes: 3
Antigüedad: 12 años, 2 meses
Puntos: 0
Problema con JPA

Buenos días, estoy empezando a practicar persistencia con JPA en Netbeans, ya pude hacer persistir una clase simple.
Mi problema está cuando quiero hacer persistir 2 clases relacionadas, para practicar esto me hice un proyecto de ejemplo en donde tengo una clase Persona y una clase Auto, estas dos clases están relacionadas de manera que una persona pueda poseer N autos, pero al momento de persistir me da el siguiente error:
Código:
Exception in thread "main" java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.
Como para que se den una idea de lo que hice les comento todos los pasos que seguí, basado en una guía que encontré:

En MySQL creé las dos tablas para persistir las clases, estas son sus estructuras

persona:
id de tipo INT, es PK y tiene activado auto increment
nombre de tipo varchar longitud 20
apellido de tipo varchar longitud 20
dni de tipo varchar longitud 8 (en Argentina el numero de dni tiene 8 cifras, por ahora)

auto:
id de tipo INT, PK, auto increment activado
marca tipo varchar longitud 15
modelo tipo varchar longitud 15
patente tipo varchar longitud 7
persona_fk tipo INT y foreign key referenciando al id de persona

En netbeans creé un nuevo proyecto llamado probandoRelacion, luego creé automáticamente las clases entidad a partir de la base de datos (olvidé decir que anteriormente había establecido la conexión a la base de datos en netbeans).
Después creé automáticamente las clases controladoras JPA de entidades.
En cada clase controladora JPA creé un constructor que no recibe ningun parámetro y crea un EntityManagerFactory, este es el constructor de la clase AutoJpaController:
Código:
public AutoJpaController(){  
        this.emf = Persistence.createEntityManagerFactory("probandoRelacionPU");
    }
Agregué la biblioteca Driver MYSQL JDBC al proyecto

En la clase Auto agregué un constructor que solo reciba marca, modelo y patente.

En la clase Persona agregué el siguiente metodo:

Código:
public void comprarAuto(String marca,String modelo, String patente){
        Auto unAuto = new Auto(marca,modelo,patente);
        autoCollection = new Vector<Auto>();
        autoCollection.add(unAuto);
        
    }
También agregué un constructor que reciba solo el nombre, apellido y dni

En la anotacion @OneToMany agregué que se utilice cascade, la anotación y el atributo quedaron así:
Código:
@OneToMany(mappedBy = "personaFk", cascade=CascadeType.ALL)
    private Collection<Auto> autoCollection;
Finalmente, en el metodo main de la clase principal escribí estas líneas:

Código:
public static void main(String[] args) {
        PersonaJpaController controlador = new PersonaJpaController();
        Persona unaPersona = new Persona("Pepito","Perez","12345678");
        unaPersona.comprarAuto("Ford", "Focus", "ASD-123");
        controlador.create(unaPersona);
    }
Les pido disculpas si el post se hizo muy largo, simplemente quise darles todos los detalles como para ayudarlos a ayudarme, hace poco empecé java por mi cuenta así que si tienen alguna sugerencia basada en lo que escribí no duden en decírmelo.

Saludos.