Hibernate mapeo uno a muchos (anotaciones)
Soy nuevo en hibernar, estoy tratando de aprenderlo y me he encontrado con un problema al tratar de hacer que la relación de uno a muchos funcione. He probado varios ejemplos, pero ninguno parece funcionar.
¿Puede alguien echar un vistazo al siguiente código y decirme dónde me he equivocado? He probado muchos tutoriales diferentes, pero siempre no funciona, así que me falta algo.
Hay dos clases: MovieDb y Genre. Para cada película debe haber muchos géneros.
Creo que he incluido todos los archivos y la información necesaria, si no, hágamelo saber.
Gracias por la ayuda.
MovieDb.java
@Entity
@Table(name = "movies")
public class MovieDb extends IdElement {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@JsonProperty("id")
@Column(name = "movieId")
private int movieId;
@JsonProperty("title")
@Column(name = "title")
private String title;
@JsonProperty("genres")
@OneToMany
private List<Genre> genres;
public int getMovieId() { return movieId; }
public String getTitle() { return title; }
public List<Genre> getGenres() { return genres; }
public void setMovieId(int movieId) { this.movieId = movieId; }
public void setTitle(String title) { this.title = title; }
public void setGenres(List<Genre> genres) { this.genres = genres; }
}
Género.java
@JsonRootName("genre")
@Entity
@Table(name = "moviesGenre")
public class Genre implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private int id;
@Column(name = "movieId")
private int movieId;
@JsonProperty("name")
@Column(name = "name")
private String name;
public int getMovieId() { return movieId; }
public String getName() { return name; }
public void setMovieId(int movieId) { this.movieId = movieId; }
public void setName(String name) { this.name = name; }
}
Main.java
public MovieDb getMovie(int movieId) {
Session s = HibernateUtil.getSessionFactory().openSession();
Transaction tx = s.beginTransaction();
MovieDb movie = null;
try {
String hql = "FROM MovieDb E WHERE E.movieId = " + movieId;
Query query = s.createQuery(hql);
List movies = query.list();
movie = (MovieDb)movies.get(0);
tx.commit();
}catch (HibernateException ex) {
if (tx != null)
tx.rollback();
}finally {
s.close();
}
return movie;
}
public void saveMovie(MovieDb movie) {
Session s = HibernateUtil.getSessionFactory().openSession();
Transaction tx = s.beginTransaction();
try {
s.save(movie);
s.flush();
tx.commit();
} catch (HibernateException ex) {
if (tx != null)
tx.rollback();
} finally {
s.close();
}
}
Mi base de datos está configurada así:
películas
id int (primary)
movieId int
title varchar
peliculas
id int (primary)
movieId int
name varchar
Mi archivo Hibernate.cfg.xml que muestra la asignación está a continuación:
Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
...
...
...
<mapping class="com.medialibrary.api.model.MovieDb"/>
<mapping class="com.medialibrary.api.model.Genre"/>
</session-factory>
</hibernate-configuration>