2010-05-17 3 views
25

Я использую Hibernate и получить«Ни в одной строке с данным идентификатором не существует», хотя она существует

Исключение в потоке «основной» 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(); 
} 

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

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

ответ

21

Eureka, я нашел его!

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

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

optional = false 

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

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

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

+7

Используйте таблицы InnoDB ... –

+0

Большое вам спасибо за сообщение ответа! – Lisa

2

Похоже, ваша вставка сделка rollbacked

+0

Извините за неясность: данные были вставлены в другое RUN приложения. Это определенно в базе данных, так как я вижу это через SQL-Query после прекращения действия приложения. И после THAT я получаю ошибку в первом запросе базы данных. – roesslerj

5

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

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

Также жаль, что неясно: данные были вставлены в другое RUN приложения. Это определенно в базе данных, так как я вижу это через SQL-Query после прекращения действия приложения. И после THAT я получаю ошибку в первом запросе базы данных. – roesslerj

0

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

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

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

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

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

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

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

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

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

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

1.Save ниже код 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.Add ПОЛЬЗОВАТЕЛЬ DEFINED расширение для SQL Developer

  • Инструменты> Предпочтение ы
  • Database> User Defined Extensions
  • Нажмите кнопку
  • "Row Добавить" В поле Тип выберите "Редактор", Место - где вы сохранили файл XML выше
  • Нажмите "Ok", а затем перезапустить SQL Developer

    3. Перейдите к любой таблице, и вы сможете увидеть дополнительную вкладку рядом с SQL, помеченную FK References, отображающую информацию FK.

    4.Справочная информация

  • http://www.oracle.com/technetwork/issue-archive/2007/07-jul/o47sql-086233.html

  • How can I find which tables reference a given table in Oracle SQL Developer?

Чтобы найти Orphan записи во всех упомянутых столов

выберите * из CHILD_TABLE где ForeignKey не в (выберите PrimaryKey из PARENT_TABLE) ;

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

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

2

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

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

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

Это причина, мы получим Hibernate ObjectNotFound исключение

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

0

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

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