gpt4 book ai didi

java - Hibernate一对多映射(注解)

转载 作者:行者123 更新时间:2023-11-30 00:22:07 27 4
gpt4 key购买 nike

我是 hibernate 新手,我正在尝试学习它,但在尝试使一对多关系正常工作时遇到了问题。我尝试了几个例子,但似乎没有一个起作用。

有人可以看一下下面的代码并告诉我哪里出了问题吗?我尝试了很多不同的教程,但总是不起作用,所以我一定错过了一些东西。

有两个类:MovieDb 和 Genre。每部电影应该有很多类型。

我相信我已经包含了所需的所有文件和信息,如果没有,请告诉我。

感谢您的帮助。

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

流派.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();
}
}

我的数据库设置如下:

电影

id          int           (primary)
movieId int
title varchar

电影类型

id          int           (primary)
movieId int
name varchar

显示映射的 Hibernate.cfg.xml 文件如下:

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>

最佳答案

在 MovieDb 类方面

@OneToMany(mappedBy="movie", cascade = CascadeType.ALL)
private List<Genre> genres;

以及类型

@ManyToOne
@JoinColumn(name="movieId")
private MovieDb movie;

代码中的错误:

当您保存父实体时,只要您不使用 CascadeType.PERSIST 或 CascadeType.ALL(对于所有操作类型),它们的子实体就不会保留

您正在尝试建立双向关系,因此您必须指定所有者mappedBy="movie"将完成这项工作 - 它表示 moveId 将写在 Genre 侧

关于java - Hibernate一对多映射(注解),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23150762/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com