Подтвердить что ты не робот

"Никакая строка с данным идентификатором не существует", хотя она существует

Я использую 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 после прекращения действия приложения. И после THAT, то есть при повторном запуске приложения, я получаю ошибку в FIRST-запросе базы данных - без удаления, никакого отката.

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

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

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

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

Ответ 1

Эврика, я нашел его!

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

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

optional = false

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

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

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

Ответ 2

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

  • Строка была вставлена ​​первым сеансом, но транзакция не была выполнена, когда второй сеанс попытался получить к ней доступ.
  • Первый сеанс отключен по какой-либо причине.

Ответ 3

Похоже, что вложение транзакций отменено

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

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

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

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

Что я сделал, найдите ссылки внешнего ключа, соответствующие таблице, связанной с Bean.

Чтобы найти ссылки на внешние ключи в разработчике 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);

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

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

Ответ 6

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

property start tag name="hbm2ddl.auto" create/update property close tag

Ответ 7

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