我想学习Hibernate。我有一个电影表,其中包含指向流派表的外键。每部电影都归属于一种流派,而每个流派可以被分配给多个电影。
以下是表的定义:
CREATE TABLE `movie` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(64) NOT NULL,
`genre_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_genre` (`genre_id`),
CONSTRAINT `fk_genre` FOREIGN KEY (`genre_id`) REFERENCES `genre` (`id`) ON UPDATE CASCADE,
)
CREATE TABLE IF NOT EXISTS `genre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
)
我的代码如下
@Entity
public class Movie implements java.io.Serializable {
private static final long serialVersionUID = 1;
private Integer id;
private String title;
private Genre genre;
...
@ManyToOne
public Genre getGenre() {
return genre;
}
此外
@Entity
public class Genre implements java.io.Serializable {
private static final long serialVersionUID = 1;
private Integer id;
private String name;
@Id
@GeneratedValue
@Column(name = "id")
public Integer getId() {
return this.id;
}
那么由Hibernate生成的查询语句如下:
select
movie0_.id as column1_4_,
movie0_.genre_id as genre11_4_,
movie0_.title as title4_
from
Movie movie0_
这不正确,因为没有参考流派表。正确的查询应该与流派表连接。更像:
select
movie0_.id as column1_4_,
genre.name as genre11_4_,
movie0_.title as title4_
from
Movie movie0_, Genre genre
where
movie0_.genre_id = genre.id;
我有点不知道我做错了什么。是不是应该在Genre类中而不是Movie类中使用多对一的注释?或者您还看到我其他做错的地方吗?
根据下面的建议,现在Movie有:
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(id).append(" ");
sb.append(title).append(" ");
this.getGenre(); //new
sb.append(genre.getName());
return sb.toString();
}
@ManyToOne(fetch=FetchType.EAGER) //new
public Genre getGenre() {
return genre;
}
我正在通过以下方式加载电影:
public static void main(String[] args) {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
List<Movie> movies = session.createQuery("from Movie").list();
for (Movie movie : movies) {
System.out.println(movie.toString());
}
session.close();
}
我看到的是,尽管我有使用“eager load”,并且在toString中明确指定了getGenre,但是没有生成查询语句,我只是得到了一个空值。
Movie
对象的?请展示你所使用的代码。 - skaffman