Añado la clase DAO en un paquete aparte
package com.trifulcas.DAO; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import com.trifulcas.hibernate.HibernateUtil; public class DAO<T> { private Class<T> entityClass; public Session session; public DAO(Class<T> clase) { this.entityClass = clase; session = HibernateUtil.getSessionFactory().openSession(); } public void save(T Objeto) { Transaction transaction = null; try { transaction = session.beginTransaction(); session.persist(Objeto); // commit transaction transaction.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } e.printStackTrace(); } } public List<T> getAll() { return session.createQuery("from " + entityClass.getSimpleName(), entityClass).list(); } public T get(int id) { return session.get(entityClass, id); } public boolean delete(int id) { Transaction transaction = null; try { transaction = session.beginTransaction(); T objeto = session.get(entityClass, id); session.remove(objeto); transaction.commit(); return true; } catch (Exception ex) { System.out.println(ex.getMessage()); if (transaction != null) { transaction.rollback(); } return false; } } }
Creo la entidad Libro
package com.trifulcas.models; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @Entity public class Libro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "idlibro") private int idLibro; private String titulo; private int paginas; @ManyToOne @JoinColumn(name="idgenero") private Genero genero; public Libro() { super(); // TODO Auto-generated constructor stub } public int getIdLibro() { return idLibro; } public void setIdLibro(int idLibro) { this.idLibro = idLibro; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public int getPaginas() { return paginas; } public void setPaginas(int paginas) { this.paginas = paginas; } public Genero getGenero() { return genero; } public void setGenero(Genero genero) { this.genero = genero; } @Override public String toString() { return "Libro [idLibro=" + idLibro + ", titulo=" + titulo + ", paginas=" + paginas + "]"; } }
Añado a Genero la anotación onetomany
package com.trifulcas.models; import java.util.ArrayList; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; @Entity public class Genero { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "idgenero") private int idGenero; private String nombre; @OneToMany(mappedBy="genero") List<Libro> libros=new ArrayList(); public Genero() { super(); // TODO Auto-generated constructor stub } public int getIdGenero() { return idGenero; } public void setIdGenero(int idGenero) { this.idGenero = idGenero; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public List<Libro> getLibros() { return libros; } public void setLibros(List<Libro> libros) { this.libros = libros; } @Override public String toString() { return "Genero [idGenero=" + idGenero + ", nombre=" + nombre + "]"; } }
Lo anoto en hibernateutil
... configuration.addAnnotatedClass(Libro.class); ...
Y lo pruebo
package com.trifulcas.Biblioteca; import com.trifulcas.DAO.DAO; import com.trifulcas.models.Genero; import com.trifulcas.models.Libro; /** * Hello world! * */ public class App { public static void main( String[] args ) { try { DAO<Genero> gdao=new DAO<>(Genero.class); Genero g=gdao.get(1); System.out.println(g); System.out.println(g.getLibros()); DAO<Libro> ldao=new DAO<>(Libro.class); Libro l=ldao.get(2); System.out.println(l); System.out.println(l.getGenero()); /* * Genero sf=new Genero(); sf.setNombre("Ciencia ficción"); gdao.save(sf); */ //gdao.delete(6); } catch (Exception ex) { System.out.println(ex); } } }
Añado autor, pongo el manytomany y modifico libro para que también lo tenga
package com.trifulcas.models; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; @Entity @Table(name = "autor") public class Autor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int idautor; private String nombre; @ManyToMany(cascade= {CascadeType.MERGE}) @JoinTable(name = "libro_autor", joinColumns = { @JoinColumn(name = "idautor") }, // La de esta entidad inverseJoinColumns = { @JoinColumn(name = "idlibro") }) List<Libro> libros = new ArrayList(); // Constructor por defecto public Autor() { } // Constructor con parámetros public Autor(String nombre) { this.nombre = nombre; } // Getters y Setters public int getIdautor() { return idautor; } public void setIdautor(int idautor) { this.idautor = idautor; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public List<Libro> getLibros() { return libros; } public void setLibros(List<Libro> libros) { this.libros = libros; } // Método toString @Override public String toString() { return "Autor{" + "idautor=" + idautor + ", nombre='" + nombre + '\'' + '}'; } }
package com.trifulcas.models; import java.util.ArrayList; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; @Entity public class Libro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "idlibro") private int idLibro; private String titulo; private int paginas; @ManyToMany(mappedBy="libros") List<Autor> autores=new ArrayList(); @ManyToOne @JoinColumn(name="idgenero") private Genero genero; public Libro() { super(); // TODO Auto-generated constructor stub } public int getIdLibro() { return idLibro; } public void setIdLibro(int idLibro) { this.idLibro = idLibro; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public int getPaginas() { return paginas; } public void setPaginas(int paginas) { this.paginas = paginas; } public Genero getGenero() { return genero; } public void setGenero(Genero genero) { this.genero = genero; } public List<Autor> getAutores() { return autores; } public void setAutores(List<Autor> autores) { this.autores = autores; } @Override public String toString() { return "Libro [idLibro=" + idLibro + ", titulo=" + titulo + ", paginas=" + paginas + "]"; } }
Lo pruebo:
package com.trifulcas.Biblioteca; import com.trifulcas.DAO.DAO; import com.trifulcas.models.Autor; import com.trifulcas.models.Genero; import com.trifulcas.models.Libro; /** * Hello world! * */ public class App { public static void main(String[] args) { try { DAO<Genero> gdao = new DAO<>(Genero.class); Genero g = gdao.get(1); System.out.println(g); System.out.println(g.getLibros()); DAO<Libro> ldao = new DAO<>(Libro.class); Libro l = ldao.get(2); System.out.println(l); System.out.println(l.getGenero()); DAO<Autor> adao = new DAO<>(Autor.class); Autor a = adao.get(2); System.out.println(a); System.out.println(a.getLibros()); Libro fantasia=ldao.get(7); // Añado el libro al autor a.getLibros().add(fantasia); // Lo guardo adao.save(a); /* * Genero sf = new Genero(); * * sf.setNombre("Fantasía romántica"); * gdao.save(sf); * Libro libro=new Libro(); * libro.setTitulo("Amor en el fin del mundo"); * libro.setPaginas(200); * libro.setGenero(sf); * ldao.save(libro); */ } catch (Exception ex) { System.out.println(ex); } } }