Я пытаюсь запустить этот базовый код JPA / EJB:
public static void main(String[] args){
UserBean user = new UserBean();
user.setId(1);
user.setUserName("name1");
user.setPassword("passwd1");
em.persist(user);
}
Я получаю такую ошибку:
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.JPA.Database
Есть идеи?
Я ищу в Интернете и нашел следующую причину:
Это было вызвано тем, как вы создавали объекты, т.е. если вы явно задали свойство ID. Удаление присвоения ID исправило это.
Но я не понял, что мне нужно будет изменить, чтобы код заработал?
Ошибка возникает из-за того, что установлен ID объекта. Hibernate различает переходные и отсоединенные объекты и
persist
работает только с переходными объектами. Еслиpersist
завершится, что объект отсоединен (что произойдет, поскольку идентификатор установлен), он вернет ошибку «Отсоединенный объект передан для сохранения». Вы можете найти более подробную информацию здесь и здесь .Однако это применимо только в том случае, если вы указали, что первичный ключ будет автоматически сгенерирован: если поле настроено так, чтобы всегда задаваться вручную, то ваш код работает.
источник
удалять
user.setId(1);
потому что он автоматически создается в БД и продолжает команду persist.
источник
Получил ответ, использовал:
Я использовал слияние вместо сохранения:
Но не знаю, почему настаивать не сработало. :(
источник
если вы используете для создания
id = GenerationType.AUTO
стратегии в своей сущности.Заменяется
user.setId (1)
наuser.setId (null)
, и проблема решена.источник
Я знаю, что уже слишком поздно, и, возможно, каждый получил ответ. Но кое-что еще можно добавить к этому: когда установлен GenerateType, ожидается, что persist () для объекта получит сгенерированный идентификатор.
Если для идентификатора уже установлено значение идентификатора пользователем, спящий режим рассматривает его как сохраненную запись и поэтому считается отсоединенным.
если идентификатор равен нулю - в этой ситуации возникает исключение нулевого указателя, если типом является AUTO или IDENTITY и т. д., если идентификатор не сгенерирован из таблицы или последовательности и т. д.
дизайн: это происходит, когда таблица имеет свойство bean-компонента в качестве первичного ключа. GenerateType должен быть установлен только тогда, когда идентификатор создается автоматически. удалите это, и вставка должна работать с идентификатором, указанным пользователем. (это плохой дизайн, когда свойство отображается в поле первичного ключа)
источник
Здесь .persist () будет вставлять только запись. Если мы используем .merge (), он проверит, существует ли какая-либо запись с текущим идентификатором, если она существует, она обновится, иначе она вставит новую запись.
источник
Если вы установите id в своей базе данных как первичный ключ и автоинкремент, то эта строка кода неверна:
user.setId(1);
Попробуйте с этим:
public static void main(String[] args){ UserBean user = new UserBean(); user.setUserName("name1"); user.setPassword("passwd1"); em.persist(user); }
источник
detached entity passed to persist
У меня была эта проблема, и она была вызвана кешем второго уровня:
Следовательно, поскольку кеш не был признан недействительным, спящий режим предполагал, что имеет дело с отдельным экземпляром той же сущности.
источник