Kamil W
Kamil W

Reputation: 2366

org.hibernate.MappingException: Unknown entity: org.hibernate.collection.internal.PersistentBag

My code below:

int userId = 42;
String stringIdBook = "42";
User user = daoUser.getUser(userId);
List<Books> booksOrderedByUser = user.getBooks();

for (Books x : booksOrderedByUser) {
    System.out.println(x.getTitle());
}

for (Books x : booksOrderedByUser) {
    String idBookString = Integer.toString(x.getIdBook());
    if (idBookString == stringIdBook) {
        booksOrderedByUser.remove(x.getIdBook());
        break;
    }

}

for (Books x : booksOrderedByUser) {
    System.out.println(x.getTitle());
}

entityManager.getTransaction().begin();
entityManager.merge(booksOrderedByUser);
entityManager.flush();
entityManager.getTransaction().commit();

entityManager.close();

When i run this jpa i got this exception:

org.hibernate.MappingException: Unknown entity: org.hibernate.collection.internal.PersistentBag
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1451)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:147)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:839)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:821)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:826)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:1161)
    at servlet.returnBookServlet.doPost(returnBookServlet.java:59)

This code gets list of books which belong to user and delete selected. First issue is book isn't removed(I print list of books via System.out.println() and list is same before and after booksOrderedByUser.remove(x.getIdBook()). Second issue is this exception during merge. Can someone tell me what I did wrong?

Upvotes: 0

Views: 1374

Answers (1)

Arnaud
Arnaud

Reputation: 17524

First of all, use equals to compare String values, not == .

Second thing is, your List contains Books objects, so calling :

remove(x.getIdBook())

has no chance to succeed.

What you want here is removing a Books object from the list, not a String object or whatever, so go this way :

remove(x)

Finally, you may want to rename your Books class to Book, since it represents only one book .

Upvotes: 2

Related Questions