Сообщение об ошибке постоянства: экземпляр нулевого PK был неправильно предоставлен для операции поиска - PullRequest
9 голосов
/ 28 ноября 2011

Я пытаюсь использовать Netbeans 7.01, чтобы следовать руководству по JSF 2.0 и JPA.Я использую оракул XE и JDBC_6.Я использовал страницы JSF из мастера создания сущностей для создания своих страниц JSF.Все работает отлично, так как я могу получить данные из базы данных и отобразить их.Однако когда я пытаюсь создать или обновить запись в базе данных, я получаю эту ошибку:

Экземпляр нулевого PK был неправильно предоставлен для операции поиска

Как это вызвано и как я могу решить это?

Ответы [ 3 ]

10 голосов
/ 28 ноября 2011

Это в основном означает, что вы сделали следующее:

Entity entity = em.find(Entity.class, null);

Обратите внимание, что здесь PK null.Чтобы решить вашу проблему, просто убедитесь, что это не null.

4 голосов
/ 08 декабря 2011

Это может быть связано с тем, что вы выполняете операцию поиска для объекта, который еще не был сохранен. В какой ситуации поле @ID (если оно создано автоматически) не будет иметь значения, т.е. это будет ноль. Затем вы пытаетесь найти сущность, и, как указывает @BalusC, вы отправляете нулевое значение в свой метод find.

2 голосов
/ 18 августа 2013

Это означает, что когда вы пытаетесь сохранить сущность, вы отправляете PK этой сущности как ноль.

Итак, у вас есть три варианта:

  • Определите вручную PK для сущности.
  • Если в вашей базе данных используется тип, такой как Serial (Informix, MS SQLSERVER и т. Д.), То значение будет автоматически инкрементировано RDMS, вы можете использовать стратегию IDENTITY, так что теперь вы можете передать нулевое значение для pk вашей сущности.

    @Entity
    public class Inventory implements Serializable { 
            @Id
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            private long id;
    
  • Если ваша база данных использует последовательности для генерации pks (Oracle, Postgresql и т. Д.), Тогда значение будет предоставлено последовательностью, поэтому вы можете использовать:

    @Entity
    public class Inventory implements Serializable {
        @Id
        @GeneratedValue(generator="InvSeq")
        @SequenceGenerator(name="InvSeq",sequenceName="INV_SEQ", allocationSize=5)
        private long id;
    

Для получения дополнительной информации вы можете увидеть: http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey

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