Hibernate выполняет удаление на выбор - PullRequest
1 голос
/ 24 февраля 2010

У меня проблема с Hibernate. Мой текущий проект - маленькая игра. В этой игре у вас есть доска , которая имеет множество полей , каждое с жетоном .
Я могу сделать выбор в пустой базе данных без каких-либо проблем, но если я добавлю в нее один объект (сохранение работает без каких-либо исключений, и после этого значения базы данных выглядят хорошо), я получаю исключения. Интересная часть в классе Board:

@OneToMany(fetch=FetchType.EAGER)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
     return gameMatrix;
}

Мой запрос на получение досок:

return getHibernateTemplate().loadAll(Board.class);

Журнал теперь выглядит так:

Hibernate: выберите this_.id как id0_2_, this_.uniqueClassName as uniqueCl3_0_2_, this_.borderDimension как borderDi4_0_2_, this_.dimension как измерение0_2_, this_.TYPE как TYPE0_2_, gamematrix2_.Board_id as Board1_4_, field3_.id as gameMatrix2_4_, (выберите точка а11 с поля а11 где a11.id = gamematrix2_.gameMatrix_id) как формула0_4_, field3_.id как id1_0_, field3_.point as point1_0_, field3_.token_id as token3_1_0_, token4_.id как id2_1_, token4_.name как name2_1_, token4_.uniqueClassName as uniqueCl4_2_1_, token4_.TYPE as TYPE2_1_ с доски this_ слева снаружи присоединиться к Board_Field gamematrix2_ на this_.id = gamematrix2_.Board_id осталось поле внешнего соединения field3_ on gamematrix2_.gameMatrix_id = field3_.id оставил внешнее соединение Token token4_ на field3_.token_id = token4_.id

Пока все не выглядит хорошо, но Hibernate делает следующее:

Hibernate: delete from Board_Field where Board_id=?  
Hibernate: insert into Board_Field (Board_id, gameMatrix_id) values (?, ?)

И я получил это исключение:

Исключение в потоке "AWT-EventQueue-0" org.springframework.dao.InvalidDataAccessApiUsageException: объект ссылается на несохраненный переходный процесс instance - сохранить временный экземпляр до промывки: поле; вложенными исключение org.hibernate.TransientObjectException: объект ссылается на несохраненный переходный процесс instance - сохранить временный экземпляр до промывки: поле

Я не понимаю, почему он делает оператор удаления.
Есть идеи?
спасибо

Ответы [ 4 ]

1 голос
/ 24 февраля 2010

У моего напарника была похожая проблема. Он не сейчас, но это было связано с целостностью базы данных.

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

Попробуйте проверить, не нарушен ли какой-либо внешний ключ, который должен быть, но не определен, и попытаться привести данные в соответствие.

1 голос
/ 24 февраля 2010

Вам необходимо установить атрибут cascade:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
     return gameMatrix;
}

И вам также нужно переопределить hashCode() и equals() для Point и Field - пусть ваша IDE (Eclipse, NetBeans, IntelliJ) сгенерирует их для вас, используя свой бизнес-ключ (т.е. не свой автоматический сгенерированный идентификатор)

0 голосов
/ 08 сентября 2018

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

По сути, я столкнулся с тем же поведением, когда установщик был фактически пуст (либо потому, что присвоение отсутствует, либо неверно, либо в установщике есть бизнес-логика, которая привела к тому, что он фактически был нулевым).

Предположим, что hibernate сначала выбирает и рассматривает данные как постоянные (кэш уровня постоянства), а затем, когда он выполняет грязную проверку, обнаруживает, что данные были удалены (потому что получатель не возвращает данные, поскольку они никогда не были установить) и приступает к удалению.

также опубликовал информацию об этом на форумах спящего режима .

Просто разместите его здесь для дальнейшего использования!

С уважением Ravindra

0 голосов
/ 24 февраля 2010

Мне кажется, вы добавляете объект Field в коллекцию Fields в классе Board, но сначала вам нужно сохранить новый объект Field (вы, вероятно, новенький)

Отсюда и сообщение об исключении: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом: Поле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...