I'm developing a sample Spring application deployed on Tomcat.
Dao class:
@Repository
public class UserDao implements IUserDao
{
@PersistenceContext
private EntityManager manager;
@Override
public User getUserById(Integer id)
{
User u = manager.find(User.class, id);
return u;
}
@Override
public User getUserByName(String name)
{
Query q = manager.createQuery("SELECT u FROM User u WHERE u.name = ?");
q.setParameter(1, name);
@SuppressWarnings("unchecked")
List<User> list = (List<User>) q.getResultList();
if(!list.isEmpty())
return list.get(0);
return null;
}
@Override
public void addUser(User u)
{
manager.persist(u);
}
}
Controller Class:
@Controller
public class HomeController
{
@Autowired
private IUserDao ud;
@RequestMapping(value = "/page")
public String getPage()
{
User u = new User();
u.setName("Harry");
ud.addUser(u);
return "page";
}
}
When requesting /page I keep getting the following exception:
No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call.
My question is why does this happen?
And why the same does not happen if I call another Dao method which does not involve the call of persist method on the Entity Manager?