Hej,
piszę prostą aplikację z użyciem springa + jpa(hibernate). Napisałem prostą klasę DAO:
public abstract class SomeDao {
@PersistenceContext
protected EntityManager entityManager;
@Transactional
public void remove(SomeEntity obj) throws RemoveException {
try {
entityManager.refresh(obj);
entityManager.remove(obj);
} catch (Exception e) {
throw new RemoveException(e);
}
}
public SomeEntity findByPrimaryKey(Object pk) throws FinderException {
SomeEntity obj = null;
try {
return entityManager.find(SomeEntity.class, pk);
} catch (Exception e) {
throw new FinderException(e);
}
}
}
Podczas usuwania encji za pomocą funkcji remove() dostaję wyjątek: java.lang.IllegalArgumentException: Entity not managed.
Jest to o tyle dziwne, że kod wygląda mniej więcej tak:
dao.remove( dao.findByPrimaryKey(someint) );
Zacząłem sprawę inwigilować bardziej i okazuje się, że obiekt pobrany za pomocą entityManager.find(); nie jest podłączony do entitymanagera (entityManager.contains(obj) zwraca false);
Co więcej, zauważyłem, że wywołanie kilka razy entityManager.find(SomeEntity.class, pk); za każdym razem odwołuje się do bazy danych.
Czyli nie dość, że find odłącza od razu encje to dodatkowo nie przechowuje ich z użyciem wzorca Identity Map.
Czy moglibyście wytłumaczyć mi to dziwne z mojego punktu widzenia zachowanie?