Я пытаюсь использовать Netbeans 7.01, чтобы следовать руководству по JSF 2.0 и JPA.Я использую оракул XE и JDBC_6.Я использовал страницы JSF из мастера создания сущностей для создания своих страниц JSF.Все работает отлично, так как я могу получить данные из базы данных и отобразить их.Однако когда я пытаюсь создать или обновить запись в базе данных, я получаю эту ошибку:
Экземпляр нулевого PK был неправильно предоставлен для операции поиска
Как это вызвано и как я могу решить это?
Это в основном означает, что вы сделали следующее:
Entity entity = em.find(Entity.class, null);
Обратите внимание, что здесь PK null.Чтобы решить вашу проблему, просто убедитесь, что это не null.
null
Это может быть связано с тем, что вы выполняете операцию поиска для объекта, который еще не был сохранен. В какой ситуации поле @ID (если оно создано автоматически) не будет иметь значения, т.е. это будет ноль. Затем вы пытаетесь найти сущность, и, как указывает @BalusC, вы отправляете нулевое значение в свой метод find.
Это означает, что когда вы пытаетесь сохранить сущность, вы отправляете 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