Próbuję uruchomić ten podstawowy kod JPA / EJB:
public static void main(String[] args){
UserBean user = new UserBean();
user.setId(1);
user.setUserName("name1");
user.setPassword("passwd1");
em.persist(user);
}
Otrzymuję ten błąd:
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.JPA.Database
Jakieś pomysły?
Wyszukuję w internecie i znalazłem powód:
Było to spowodowane sposobem tworzenia obiektów, tj. Jawnym ustawieniem właściwości ID. Usunięcie przypisania ID naprawiło to.
Ale nie rozumiem, co będę musiał zmodyfikować, aby kod działał?
Błąd występuje, ponieważ ustawiono identyfikator obiektu. Hibernate rozróżnia obiekty przejściowe i odłączone i
persist
działa tylko z obiektami przejściowymi. Jeślipersist
dojdzie do wniosku, że obiekt jest odłączony (co zrobi, ponieważ identyfikator jest ustawiony), zwróci błąd „odłączony obiekt przekazany do utrwalenia”. Więcej szczegółów znajdziesz tutaj i tutaj .Ma to jednak zastosowanie tylko wtedy , gdy określono, że klucz podstawowy ma być generowany automatycznie: jeśli pole jest skonfigurowane tak, aby zawsze było ustawiane ręcznie, kod działa.
źródło
usunąć
user.setId(1);
ponieważ jest generowany automatycznie w bazie danych i kontynuuj z poleceniem persist.
źródło
Otrzymałem odpowiedź, użyłem:
Użyłem scalania zamiast trwałego:
Ale nie mam pojęcia, dlaczego upór nie zadziałał. :(
źródło
jeśli używasz do generowania
id = GenerationType.AUTO
strategii w swojej jednostce.Zastępuje
user.setId (1)
przezuser.setId (null)
i problem został rozwiązany.źródło
Wiem, że jest za późno i każdy z nich dostał odpowiedź. Ale trochę więcej do dodania do tego: gdy jest ustawiona opcja GenerateType, oczekuje się, że persist () na obiekcie otrzyma wygenerowany identyfikator.
Jeśli istnieje już ustawiona wartość identyfikatora przez użytkownika, hibernacja traktuje go jako zapisany rekord, a więc jest traktowany jako odłączony.
jeśli id jest null - w tej sytuacji wyjątek wskaźnika zerowego jest zgłaszany, gdy typ to AUTO lub IDENTITY itp., chyba że identyfikator jest generowany z tabeli lub sekwencji itp.
design: dzieje się tak, gdy tabela ma właściwość bean jako klucz podstawowy. GenerateType należy ustawić tylko wtedy, gdy identyfikator jest generowany automatycznie. usuń to, a insert powinien działać z identyfikatorem określonym przez użytkownika. (to zły projekt mieć właściwość mapowaną na pole klucza podstawowego)
źródło
Tutaj tylko .persist () wstawi rekord. Jeśli użyjemy .merge () , sprawdzi, czy istnieje jakiś rekord z bieżącym identyfikatorem, jeśli istnieje, zaktualizuje się, w przeciwnym razie wstawi nowy rekord.
źródło
Jeśli ustawisz id w swojej bazie danych jako klucz podstawowy i autoincrement, to ten wiersz kodu jest nieprawidłowy:
user.setId(1);
Spróbuj z tym:
public static void main(String[] args){ UserBean user = new UserBean(); user.setUserName("name1"); user.setPassword("passwd1"); em.persist(user); }
źródło
detached entity passed to persist
Miałem ten problem i był on spowodowany pamięcią podręczną drugiego poziomu:
Dlatego, ponieważ pamięć podręczna nie została unieważniona, hibernacja zakłada, że ma do czynienia z odłączoną instancją tej samej jednostki.
źródło