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:
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é:Exception in thread "main" java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.
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:
Agregué la biblioteca Driver MYSQL JDBC al proyectopublic AutoJpaController(){ this.emf = Persistence.createEntityManagerFactory("probandoRelacionPU"); }
En la clase Auto agregué un constructor que solo reciba marca, modelo y patente.
En la clase Persona agregué el siguiente metodo:
Código:
También agregué un constructor que reciba solo el nombre, apellido y dnipublic void comprarAuto(String marca,String modelo, String patente){ Auto unAuto = new Auto(marca,modelo,patente); autoCollection = new Vector<Auto>(); autoCollection.add(unAuto); }
En la anotacion @OneToMany agregué que se utilice cascade, la anotación y el atributo quedaron así:
Código:
Finalmente, en el metodo main de la clase principal escribí estas líneas:@OneToMany(mappedBy = "personaFk", cascade=CascadeType.ALL) private Collection<Auto> autoCollection;
Código:
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.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); }
Saludos.