2011-11-07 46 views
0

我是Hibernate的新手,所以我的问题可能会很愚蠢,因为我被困住了,很乐意获得帮助。休眠OneToMany。从数据库加载时获取空列表

我有两个实体:书和标签具有以下结构:

@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 

插入正常工作,这里是HQL查询:

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

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

选择查询看起来不错还有:

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我得到正确的对象与标签的空列表。 从数据库加载对象:

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

其中T是BookEntity,类型为类和PK是字符串。

我在做什么错了? 在此先感谢。

+0

插入到'BookEntity_Tag'连接表中的位置在哪里? – millhouse

回答

1

首先选择isbn作为主键不是最受启发的想法。如果用户输入错误并输入错误的isbn会怎么样?

其次,在我看来,你试图映射从书到标签的多对多关系。或者也许是一对多?

对于多对多使用:

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

对一对多用途:

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

但你最好用book_id替换ISBN。

+0

谢谢,这工作!关于isbn - 客户端代码只会通过Builder验证isbn代码来创建图书,因此它不会让用户坚持错误的数据。当isbn是pk时,更易于kepp数据完整性。 – Grook