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);
}
}
}