Исправить ошибку Hibernate "Использовать одно и то же имя существа дважды"

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

Что означает "Использовать одно и то же имя существа дважды".

Ответ 1

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

Пример ошибки:

package A;

@Entity
class Cell{
 ...   
}


package B;

@Entity
class Cell{
 ...   
}

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

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


package B;

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

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

...createQuery("from a.Cell")...

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

<xml>nicely formatted</xml>

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

Ответ 5

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

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

Ответ 6

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

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

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

Это уродливо, но это обходное решение.