私は休止状態を学習しようとしています。私は、ジャンルテーブルへの外部キーを持つムービーテーブルを持っています。各ムービーは1つのジャンルに割り当てられます。各ジャンルは多くの映画に割り当てられることがあります。ここでHibernateの外部キーの構文
がテーブル定義している:私はインクルードが休止状態で生成されたSELECTまた
@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;
}
持っているコードの場合
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`)
)
は
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クラスに入れる必要がありますか?それとも、私が間違っていることが他にもありますか?下記のアドバイスに基づいて
、映画は今
@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();
}
ていること、私は熱心を持っているにもかかわらずロードと私は明示的にgetGenre toStringで、クエリが生成されていないと私はちょうど戻ってきています。あなたはHQLの構文(例えばcreateQuery("from Movie")
)を使用すると、あなたのMovie
オブジェクトにgetGenre()
を呼び出すとき
'Movie'オブジェクトをどのように取得していますか?それを行うために使用しているコードを表示してください。 – skaffman
私は上記の説明をあなたの提案であるskaffmanに応じて編集しました。 –