2011-11-07 8 views
0

私はHibernateを初めて使うので、私の質問はちょっとばかげているかもしれません。私は固執して助けを得てうれしく思います。Hibernate OneToMany。 DBからのロード時に空のリストを取得する

insert into PUBLIC.BookEntity 
(author, edition, publisher, title, yearOfPublishing, isbn) 
values (?, ?, ?, ?, ?, ?) 

insert into PUBLIC.Tag 
(tagId, tagValue) 
values (null, ?) 

選択クエリが正常に見える:ここでHQLクエリで、

@Entity 
public class BookEntity{ 

@Column(nullable = false) 
private String title; 
@Column(nullable = false) 
private String author; 
private String publisher; 
private int edition; 
private int yearOfPublishing; 

@Id 
@Column(name = "isbn") 
private String isbn; 

@ElementCollection(fetch = FetchType.EAGER) 
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
@JoinTable(joinColumns = { @JoinColumn(name = "isbn") }, 
      inverseJoinColumns = { @JoinColumn(name = "tagId") }) 
private List<Tag> tags; 
//getters & setters 

@Entity 
public class Tag implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int tagId; 
private String tagValue; 
//getters & setters 

挿入が正常に動作します:次のような構造を持つブックとタグ:

は、私は2つのエンティティを持っていますまた:

select 
     bookentity0_.isbn as isbn35_1_, 
     bookentity0_.author as author35_1_, 
     bookentity0_.edition as edition35_1_, 
     bookentity0_.publisher as publisher35_1_, 
     bookentity0_.title as title35_1_, 
     bookentity0_.yearOfPublishing as yearOfPu6_35_1_, 
     tags1_.isbn as isbn35_3_, 
     tag2_.tagId as tagId3_, 
     tag2_.tagId as tagId36_0_, 
     tag2_.tagValue as tagValue36_0_ 
    from 
     PUBLIC.BookEntity bookentity0_ 
    left outer join 
     PUBLIC.BookEntity_Tag tags1_ 
      on bookentity0_.isbn=tags1_.isbn 
    left outer join 
     PUBLIC.Tag tag2_ 
      on tags1_.tagId=tag2_.tagId 
    where 
     bookentity0_.isbn=? 

私はデータベースからBookEntityをロードしていますが、タグの空のリストで正しいオブジェクトを取得しています。データベースから 積載物:TがBookEntityある

public T read(PK id) { 
    LOG.debug("Reading by id={}", id.toString()); 
    return (T)getSession().get(type, id); 
} 

は、タイプはクラスであり、PK文字列です。

私は間違っていますか? ありがとうございます。

+0

「BookEntity_Tag」結合テーブルへの挿入はどこですか? – millhouse

答えて

1

まず、主キーとしてisbnを選択することは、最も影響を受けたアイデアではありません。ユーザーがタイプミスをして、間違ったisbnを入力するとどうなりますか?

第2に、書籍からタグまで多かれ少なかれ多くの関係をマッピングしようとしているようです。あるいは多分1対多数?多くの使用には多くの場合

@ManyToMany 
@JoinTable(name = "book_tag", 
    joinColumns = {@JoinColumn(name = "isbn")}, 
    inverseJoinColumns = {@JoinColumn(name = "tag_id")} 
) 

多く使用する1つの場合:

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
@JoinColumn(name = "isbn", nullable = false) 

しかし、あなたがより良いbook_idでISBNコードを交換してください。

+0

ありがとう、それは動作します! isbnについて - クライアントコードは、isbnコードを検証するBuilderを介してのみ本を作成するので、間違ったデータを残すことはありません。 isbnがpkの場合、データの整合性を保持する方が簡単です。 – Grook

関連する問題