Hibernate OneToMany. Получение пустого списка при загрузке из БД - PullRequest
0 голосов
/ 08 ноября 2011

Я новичок в Hibernate, поэтому мой вопрос может быть немного глупым, потому что я застрял и буду рад получить помощь.

У меня есть две сущности: 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

@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 - строка.

Что я делаю не так? Заранее спасибо.

1 Ответ

1 голос
/ 08 ноября 2011

Прежде всего, выбор 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)

Но лучше заменить isbn наbook_id.

...