2009-09-07 2 views
1

Возможные Дублировать:
Hibernate: different object with the same identifier value was already associated with the sessionУдаление гибернации объект с tapestry5 дает: «другой объект с тем же значением идентификатора уже связан с сеансом»

У меня есть ошибка будучи брошенное на удаление объекта. Я имею пользователей только в одной группе за раз, так что это отношения ManyToOne в классе User. В классе страницы У меня есть свойство группы:

@Property @Persist private Group group; 

, заполняемый при активации страницы:

public void onActivate(Group g) { 
    group = g; 
} 

Когда удаление ActionLink нажата, это выполняется:

@CommitAfter 
public ListBillingUserGroups onActionFromDelete() { 
    for (User u : getUsersInGroup()) 
     u.setGroup(null); 
    session.delete(group); 
    return listPage; 
} 

public List<User> getUsersInGroup() { 
    Criteria c = session.createCriteria(User.class) 
     .add(eq("company", ctx.getUser().getCompany())) 
     .add(eq("group", group)); 
    return c.list(); 
} 

Когда в группе нет пользователей, затем происходит удаление, и браузер перенаправляется на страницу списка (как и ожидалось). Однако, если группа имеет пользователь в, то я получаю исключение брошенное из спящего режима, с сообщением:

a different object with the same identifier value was already associated with the session: [my.package.Group#10] 

с StackTrace:

org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:613) 
org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:121) 
org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74) 
org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:793) 
org.hibernate.impl.SessionImpl.delete(SessionImpl.java:771) 
... my code ... 

ошибка все еще происходит, если я заменю метод onActionFromDelete с :

@CommitAfter 
public ListBillingUserGroups onActionFromDelete() { 
    for (User u : getUsersInGroup()) 
     System.out.print(" >> " + u.getGroup()); 
    session.delete(group); 
    return listPage; 
} 

ошибка все еще происходит (в отличие от получения исключения ограничений voilation), но если я заменить его:

@CommitAfter 
public ListBillingUserGroups onActionFromDelete() { 
    session.delete(group); 
    return listPage; 
} 

Я получаю исключение нарушения ограничений.

Таким образом, он ведет себя так, как будто вызов метода getAllUsersInGroup изменяет объект группы на другой объект, представляющий один и тот же объект (тот же класс, тот же идентификатор). Любые намеки на то, что я делаю неправильно?

ответ

3

Я думаю, вы должны попробовать:

@Persist("entity") 

потому что @Pesist аннотация (без Params) хранить объект группы в сессии, и к тому времени, вы удалите его, является отдельным объектом.

http://tapestry.apache.org/tapestry5/tapestry-hibernate/userguide.html

альтернатива хранить идентификатор группы (вместо объекта группы) и получить объект в OnActivate методом.

0

Я не знаю, для гобелена, но в Hibernate ...

Это сообщение происходит при попытке удалить объект (пара: класс и идентификатор), используя объект А, в то время как сессия Hibernate уже есть экземпляр B, соответствующий этой паре.

Например, если загрузка ваших пользователей загружает объект (возможно, ленив). Таким образом, чтобы удалить группу, вы должны использовать экземпляр группы (точный объект java), который использовался Hibernate как группа пользователей. Если вы используете другой экземпляр, вы получите это исключение.

+0

Я думаю, что я использую один и тот же объект. У меня есть свойство класса страницы, которое заполняется гобеленом, когда запрашивается страница (группа, о которой я упоминал). Я использую эту группу в запросе, чтобы перечислить всех пользователей в группе с помощью API критериев, а затем попытаться удалить ее. Думаю, я мог бы перефразировать мой вопрос: «Почему они не одни и те же объекты?» – l0st3d

+0

@ IOst3d Я предлагаю вам убедиться: откройте отладчик и проверьте, является ли он одним и тем же экземпляром (используйте идентификатор объекта Java, который отображается в отладчике). Этот момент необходим. – KLE

Смежные вопросы

 Смежные вопросы