Java 冬眠一天。从数据库加载时获取空列表

Java 冬眠一天。从数据库加载时获取空列表,java,hibernate,orm,one-to-many,Java,Hibernate,Orm,One To Many,我刚开始冬眠,所以我的问题可能有点傻,因为我有点呆滞,很乐意得到帮助 我有两个实体:具有以下结构的Book和Tag: @Entity public class BookEntity{ @Column(nullable = false) private String title; @Column(nullable = false) private String author; private String publisher; private int edition; private int y

我刚开始冬眠,所以我的问题可能有点傻,因为我有点呆滞,很乐意得到帮助

我有两个实体:具有以下结构的Book和Tag:

@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
插入工作正常,以下是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,type是Class,PK是String

我做错了什么?
提前感谢。

首先,选择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)
对于一对多用途:

@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)

但是您最好用图书id替换isbn。

插入到
BookEntity\u标签的位置在哪里
join表?谢谢,这很有效!关于isbn-客户端代码将仅通过验证isbn代码的生成器创建书籍,所以它不会让用户保留错误的数据。当isbn是pk时,kepp数据完整性更容易实现。