簡體   English   中英

Hibernate外鍵語法

[英]Hibernate Foreign Key Syntax

我正在努力學習休眠。 我有一個帶有流派表的外鍵的電影表。 每部電影都分配到一個類型。 每種類型都可以分配給許多電影。

以下是表定義:

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類嗎? 或者你看到其他任何我做錯了嗎?

根據以下建議,電影現在有

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

我所看到的是,即使我有急切的負載,我明確地在toString中說getGenre,也沒有生成任何查詢,我只是得到一個null。

當您使用HQL語法(例如createQuery("from Movie") )時,Hibernate / JPA將僅在您對Movie對象調用getGenre()時獲取Genre實體。 這被稱為“懶人取物”。 調用該方法時,Hibernate將發出另一個查詢來獲取Genre

請注意,HQL查詢會忽略注釋上的FetchType - HQL用於告訴Hibernate 到底要做什么,而不是使用注釋中的提示。

為了使它獲取Genre的查詢相同的Movie ,你需要告訴它:

createQuery("from Movie m join fetch m.genre")

嘗試這個:

Moive方面:

@ManyToOne
@JoinColumn(name = "genre_id")
public Genre getGenre() {..}

在另一邊(類型):

@OneToMany(mappedBy="genre")
List/Set getMovies(){..}

那么你可以從一個電影對象movie.getGenre()得到流派。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM