«Строка с указанным идентификатором не существует», хотя существует - PullRequest
26 голосов
/ 17 мая 2010

Я использую Hibernate и получаю

Исключение в потоке "main" org.hibernate.ObjectNotFoundException: строка с указанным идентификатором не существует: [# 271]

Что довольно странно в этой ошибке, так это то, что объект с данным идентификатором существует в базе данных. Я вставил проблемную запись в другой запуск приложения. Если я получаю к нему доступ в то же время (т. Е. В том же сеансе гибернации), кажется, нет проблем с получением данных.

Только потому, что это может быть ошибкой отображения:

public class ProblemClass implements Persistent {
  @ManyToOne(optional = false)
  private MyDbObject myDbObject;
}
public class MyDbObject implements Persistent {
  @OneToMany(mappedBy = "myDbObject")
  private List<ProblemClass> problemClasses;
  @ManyToOne(optional = false)
  private ThirdClass thirdClass;
}

Я понятия не имею, даже где смотреть. Любые советы высоко ценятся!

Просто чтобы уточнить: Данные были вставлены в другой RUN приложения. Это определенно находится в базе данных, как я вижу это через SQL-Query после завершения приложения. И после ЭТО, то есть при повторном запуске приложения, я получаю сообщение об ошибке в ПЕРВОМ запросе базы данных - без удаления, без откатов.

Дополнение: Поскольку его спросили, вот код для извлечения данных:

public List<ProblemClass> getProblemClasses() {
    Query query = session.createQuery("from ProblemClass");
    return query.list();
}

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

public void save(Persistent persistent) {
    session.saveOrUpdate(persistent);
}

Ответы [ 7 ]

24 голосов
/ 17 мая 2010

Эврика, я нашла это!

Проблема заключалась в следующем:

Данные в таблице ThirdClass не были сохранены правильно. Поскольку на эти данные ссылались из MyDbObject через

optional = false

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

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

Решение: необязательно = верно или правильно введены данные.

5 голосов
/ 17 мая 2010

Возможные причины:

  1. Строка была вставлена ​​первым сеансом, но транзакция не была зафиксирована, когда второй сеанс попытался получить к ней доступ.
  2. Первый сеанс по какой-то причине откатывается назад.
2 голосов
/ 14 ноября 2016

Основная причина этой проблемы - несоответствие данных, например, у меня есть класс отображения сущности с именем «X», столбец «column1» и ссылка на таблицу «Y» column «column1», как показано ниже

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "column1", referencedColumnName = "column1")
public Y getColumn1() {
    return Y;
}

В этом случае, если таблица X столбца 1 имеет значение, а таблица Y столбца 1 не имеет значения. Здесь ссылка будет неудачной.

По этой причине мы получим Hibernate objectNotFound исключение

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

2 голосов
/ 17 мая 2010

Похоже, ваша транзакция откатывается

1 голос
/ 09 ноября 2016

Это может быть ваш случай, пожалуйста, проверьте мой ответ на другой пост.

https://stackoverflow.com/a/40513787/6234057

У меня было то же исключение Hibernate.

После некоторой отладки я понял, что проблема вызвана дочерними записями «Сирота».

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

Записи, которые имеют отношение к несуществующим родителям!

Что я сделал, так это нахожу ссылки Внешнего ключа, соответствующие Таблице, связанной с Бином.

Чтобы найти ссылки на внешние ключи в SQL-разработчике

1.Сохранить приведенный ниже код XML в файл (fk_reference.xml)

<items>
<item type="editor" node="TableNode" vertical="true">
<title><![CDATA[FK References]]></title>
<query>
    <sql>
        <![CDATA[select a.owner,
                        a.table_name,
                        a.constraint_name,
                        a.status
                 from   all_constraints a
                 where  a.constraint_type = 'R'
                        and exists(
                           select 1
                           from   all_constraints
                           where  constraint_name=a.r_constraint_name
                                  and constraint_type in ('P', 'U')
                                  and table_name = :OBJECT_NAME
                                  and owner = :OBJECT_OWNER)
                           order by table_name, constraint_name]]>
    </sql>
</query>
</item>

2.Добавить расширение USER DEFINED в SQL Developer

Чтобы найти записи о сиротах во всех указанных таблицах

выбрать * из CHILD_TABLE где FOREIGNKEY не указан (выберите PRIMARYKEY из PARENT_TABLE);

Удалите эти потерянные записи, зафиксируйте изменения и перезапустите сервер, если требуется.

Это решило мое исключение. Вы можете попробовать то же самое.

0 голосов
/ 18 декабря 2017

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

0 голосов
/ 27 января 2016

Пожалуйста, обновите ваш hibernate файл конфигурации, как указано ниже:

property start tag name="hbm2ddl.auto" create/update property close tag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...