Исправлена ​​ошибка в Hibernate «Использование одного и того же имени объекта дважды» - PullRequest
11 голосов
/ 06 октября 2008

Как исправить следующую ошибку Hibernate:

Что означает «Использование одного и того же имени объекта дважды».

Ответы [ 6 ]

14 голосов
/ 28 апреля 2014

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

Пример случая ошибки:

package A;

@Entity
class Cell{
 ...   
}


package B;

@Entity
class Cell{
 ...   
}

Пример решения: пакет А;

@Entity(name="a.Cell")
class Cell{
 ...   
}


package B;

@Entity(name="b.Cell")
class Cell{
 ...   
}

Итак, чтобы использовать их в HQL, вы должны написать

...createQuery("from a.Cell")...
2 голосов
/ 23 апреля 2009

Я сталкивался с этой ошибкой несколько раз. Причины были следующими:

  1. В моей конфигурации гибернации было двойное сопоставление (проверьте конфигурационный файл / код)
  2. Два потока пытались создать объект HibernateSessionFactory одновременно. Синхронизированная блокировка кода инициализации исправила это.
  3. Попытка построить HibernateSessionFactory не удалась, но вызывается снова. Объект конфигурации Hibernate не был очищен, поэтому объекты снова обрабатываются.
  4. У вас есть два класса сущностей, которые отображаются в один и тот же файл. Hibernate задохнется и от этого.
1 голос
/ 28 июля 2017

У меня недавно появилась эта ошибка (двойной импорт): два объекта с одинаковым именем «MyEntity», но из разных пакетов / модулей com.test1.MyEntity com.test2.MyEntity

Я не использовал их, но они были загружены hibernate в jboss. Мне не разрешали менять сущности, поэтому мне пришлось обойтись.

  1. Добавьте <property name="hibernate.auto-import" value="false"/> к persistance.xml. Это предотвратило выдачу дублирующихся исключений при развертывании в jboss. Но при вызове моего запроса было сгенерировано исключение.
  2. Использовать JPQL-запрос. В моем случае это выглядело так: entityManager.createQuery("Select a.Name, b.name from AEntity a, BEntity b where a.ID = b.parentID")

Это ужасно, но это обходной путь.

1 голос
/ 13 января 2015

Другая распространенная ошибка заключается в том, что вы недавно переместили один из ваших классов персистентности (из одного пакета в другой), но вашей IDE не удалось правильно очистить файлы .class.

Или некоторые файлы .class все еще находятся на вашем сервере приложений.

0 голосов
/ 21 апреля 2009

Одной из наиболее распространенных ошибок, которые вы можете совершить, чтобы создать эту ошибку, является попытка сохранить два разных класса Java в таблицах с одинаковыми именами. Hibernate нравится, что в каждой таблице есть что-то одно (за некоторыми исключениями для подклассов и т. П.), И поэтому, если вам нужно создать класс с именем, возможно, StudentRecord, и класс с именем MusicRecords, и если вы тогда сказали Hibernate, чтобы сохранить из этих классов в таблицу под названием «записи», вы могли бы создать такого рода исключения. С этой конкретной формулировкой я подозреваю, что вы используете аннотации (в этом случае даже проще случайно назвать две таблицы, описанные в двух разных классах Java, то же самое).

Надеюсь, это поможет! (хотя, возможно, нет, как я заметил только что, когда вы задали этот вопрос 7 месяцев назад. Надеюсь, вы еще не застряли, сэр!)

0 голосов
/ 06 октября 2008

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

Без дополнительной информации я бы попытался закомментировать кусочки вашего конфигурационного файла, чтобы вы не увидели ошибку, а затем медленно добавлять разделы обратно, пока не обнаружите ошибку?

Если его всего несколько конфигурационных файлов, то почему бы не опубликовать их здесь? При публикации, если вы добавите 4 пробела в начало вашего XML, то это будет:

<xml>nicely formatted</xml>

Надеюсь, это поможет.

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