«не удалось лениво инициализировать коллекцию ролей» - PullRequest
0 голосов
/ 17 мая 2019

В моем проекте я использую PostgreSQL и Hibernate для соединения с моим ZUL и всем этим шумом.Соединение, которое я пытаюсь установить, - это способ пользователя Facebook, идентификатор которого появляется в нескольких сообщениях и комментариях.Это требует заключения сделок OneToMany и ManyToOne.Я впервые делаю такого рода соединения в ZK и Hibernate, и я был бы признателен, если бы мне указали, где я ошибаюсь.

Вот ошибки, которые появляются несколько раз:

Caused by: org.zkoss.zel.ELException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Grave:   org.zkoss.zk.ui.UiException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session at [file:/C:/Users/Frank/Documents/Work/Fakebook_v3/build/web/index.zul, line:42]
Grave:   org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: pojos.Post.comments, could not initialize proxy - no Session

И вот java-файлы Post, Comment и FBUser:

@Entity
@Table(name = "post")
@org.hibernate.annotations.Entity(dynamicUpdate = true)
public class Post implements java.io.Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "postid", updatable = false, nullable = false)
private int postid;

@Column(name = "fbuser")
private Fbuser fbuser;

@Column(name = "info")
private String info;

@Column(name = "plikes")
private int plikes;

@Column(name = "comments")
@OneToMany(fetch = FetchType.EAGER, mappedBy = "post", cascade = CascadeType.ALL)
private Collection<Comment> comments = new LinkedHashSet<Comment>();

//getters, setters and other tools

@Entity
@Table(name = "comment")
@org.hibernate.annotations.Entity(dynamicUpdate = true)
public class Comment implements java.io.Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "commentid", updatable = false, nullable = false)
private int commentid;

@Column(name = "fbuser")
private Fbuser fbuser;

@Column(name = "post")
@ManyToOne
@JoinColumn(name="post", nullable=false)
private Post post;

@Column(name = "info")
private String info;

@Column(name = "clikes")
private int clikes;

//getters, setters and other tools

@Entity
@Table(name = "fbuser")
@org.hibernate.annotations.Entity(dynamicUpdate = true)
public class Fbuser implements java.io.Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "fbuserid", updatable = false, nullable = false)
private int fbuserid;

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

@Column(name = "comments")
@OneToMany(fetch = FetchType.EAGER, mappedBy = "fbuser", cascade = CascadeType.ALL)
private Set<Comment> comments = new HashSet<Comment>(0);

@Column(name = "posts")
@OneToMany(fetch = FetchType.EAGER, mappedBy = "fbuser", cascade = CascadeType.ALL)
private Collection<Post> posts = new LinkedHashSet<Post>();

//getters, setters and other tools

И мой коннектор с Hibernate в основном этот код несколько разс разными именами таблиц и ID:

public List<Post> getPosts() throws Exception {
    session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();

    String toDo = "FROM Post ORDER BY postid DESC";

    List<Post> posts = session.createQuery(toDo).list();

    session.getTransaction().commit();
    session.close();
    return posts;
}

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Было удивительно узнать, что моя ошибка была не в контроллерах, а в hbm.xml файлов Post, Comment и Fbuser.В этих файлах у меня есть эти строки по-разному:

<many-to-one name="fbuser" class="pojos.Fbuser" lazy="false" fetch="select">
    <column name="fbuser_id" not-null="true" />
</many-to-one>
<property name="info" type="string">
    <column name="info" length="300" not-null="true" />
</property>
<property name="plikes" type="int">
    <column name="plikes" not-null="true" />
</property>
<set name="comments" table="comment" inverse="true" lazy="false" fetch="select">
    <key>
        <column name="post_id" not-null="true" />
    </key>
    <one-to-many class="pojos.Comment" />
</set>

Проблема возникла, когда я не добавил атрибут lazy="false" в наборы и теги многие-к-одному / один-ко-многим!

0 голосов
/ 17 мая 2019

Проблема в том, что сессия закрывается, когда вы хотите попытаться получить сообщения Fbuser. Очевидно, что готовая загрузка не работает с тем, как вы извлекаете данные. У вас есть несколько вариантов:

1) Грязный хак: активно загружать посты при извлечении Fbuser

String toDo = "FROM Fbuser ORDER BY fbuserid DESC";
List<Fbuser> fbusers = session.createQuery(toDo).list();
for (Fbuser fbuser : fbusers)
    Hibernate.initialize(fbuser.getPosts());

Недостатком этого является то, что вам, возможно, потребуется затем просмотреть сообщения и получить комментарии. Довольно уродливо и потенциально очень много времени, если там большое количество пользователей, постов и комментариев.

2) Выполните запрос в режиме гибернации, чтобы выполнить загрузку:

public Fbuser getFbuserById(long fbuserid) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Fbuser fbuser = session.get(Fbuser.class, fbuserid);
    session.close();
    return fbuser;
}

Вероятно, лучший и наиболее эффективный способ - удалить загружаемую загрузку и извлекать данные по мере необходимости, что очень похоже на то, что вы делаете.

...