title: org.hibernate.MappingException: Unknown entity: com.travelplanner.rest.entity.User
body: <p>I have created an Entity class and when I run the application I get the above error. I have matched the code with that of the instructor and still I get the exception. Have been looking for the solution but could not resolve it. Hence, thought to post here.</p>
  
  <p>The stack trace for the same:</p>
  
  <pre><code>SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/spring-crm-rest] threw exception [Request processing failed; nested exception is org.hibernate.MappingException: Unknown entity: com.travelplanner.rest.entity.User] with root cause
  org.hibernate.MappingException: Unknown entity: com.travelplanner.rest.entity.User
      at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620)
      at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1635)
      at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:225)
      at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:499)
      at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:83)
      at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
      at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:660)
      at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:652)
      at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:647)
      at com.travelplanner.rest.dao.UserDAOImpl.saveUser(UserDAOImpl.java:45)
      at com.travelplanner.rest.service.UserServiceImpl.saveUser(UserServiceImpl.java:29)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
      at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
      at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
      at com.sun.proxy.$Proxy125.saveUser(Unknown Source)
      at com.travelplanner.rest.controller.UserRestController.addUser(UserRestController.java:24)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
      at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
      at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
      at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
      at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
      at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
      at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
      at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)
      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
      at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
      at java.lang.Thread.run(Thread.java:748)
  </code></pre>
  
  <p>below is the <strong>config.java</strong></p>
  
  <pre><code>package com.travelplanner.rest.config;
  
  import java.beans.PropertyVetoException;
  import java.util.Properties;
  import java.util.logging.Logger;
  
  import javax.sql.DataSource;
  
  import org.hibernate.SessionFactory;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.PropertySource;
  import org.springframework.core.env.Environment;
  import org.springframework.orm.hibernate5.HibernateTransactionManager;
  import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
  import org.springframework.transaction.annotation.EnableTransactionManagement;
  import org.springframework.web.servlet.ViewResolver;
  import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  import org.springframework.web.servlet.view.InternalResourceViewResolver;
  
  import com.mchange.v2.c3p0.ComboPooledDataSource;
  
  @Configuration
  @EnableWebMvc
  @EnableTransactionManagement
  @ComponentScan("com.travelplanner.rest")
  @PropertySource({ "classpath:persistence-mysql.properties" })
  public class DemoAppConfig implements WebMvcConfigurer {
  
      @Autowired
      private Environment env;
  
      private Logger logger = Logger.getLogger(getClass().getName());
  
      @Bean
      public DataSource myDataSource() {
  
          // create connection pool
          ComboPooledDataSource myDataSource = new ComboPooledDataSource();
  
          // set the jdbc driver
          try {
              myDataSource.setDriverClass("com.mysql.jdbc.Driver");       
          }
          catch (PropertyVetoException exc) {
              throw new RuntimeException(exc);
          }
  
          // for sanity's sake, let's log url and user ... just to make sure we are reading the data
          logger.info("jdbc.url=" + env.getProperty("jdbc.url"));
          logger.info("jdbc.user=" + env.getProperty("jdbc.user"));
  
          // set database connection props
          myDataSource.setJdbcUrl(env.getProperty("jdbc.url"));
          myDataSource.setUser(env.getProperty("jdbc.user"));
          myDataSource.setPassword(env.getProperty("jdbc.password"));
  
          // set connection pool props
          myDataSource.setInitialPoolSize(getIntProperty("connection.pool.initialPoolSize"));
          myDataSource.setMinPoolSize(getIntProperty("connection.pool.minPoolSize"));
          myDataSource.setMaxPoolSize(getIntProperty("connection.pool.maxPoolSize"));     
          myDataSource.setMaxIdleTime(getIntProperty("connection.pool.maxIdleTime"));
  
          return myDataSource;
      }
  
      private Properties getHibernateProperties() {
  
          // set hibernate properties
          Properties props = new Properties();
  
          props.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
          props.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
  
          return props;               
      }
  
  
      // need a helper method 
      // read environment property and convert to int
  
      private int getIntProperty(String propName) {
  
          String propVal = env.getProperty(propName);
  
          // now convert to int
          int intPropVal = Integer.parseInt(propVal);
  
          return intPropVal;
      }   
  
      @Bean
      public LocalSessionFactoryBean sessionFactory(){
  
          // create session factorys
          LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
  
          // set the properties
          sessionFactory.setDataSource(myDataSource());
          sessionFactory.setPackagesToScan(env.getProperty("hibernate.packagesToScan"));
          sessionFactory.setHibernateProperties(getHibernateProperties());
  
          return sessionFactory;
      }
  
      @Bean
      @Autowired
      public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
  
          // setup transaction manager based on session factory
          HibernateTransactionManager txManager = new HibernateTransactionManager();
          txManager.setSessionFactory(sessionFactory);
  
          return txManager;
      }   
  
  }
  </code></pre>
  
  <p>Below is the <strong>User entity class</strong>:</p>
  
  <pre><code>package com.travelplanner.rest.entity;
  
  import javax.persistence.CascadeType;
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.JoinColumn;
  import javax.persistence.OneToOne;
  import javax.persistence.Table;
  
  @Entity
  @Table(name="users")
  public class User {
  
      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      @Column(name="id")
      private int id;
  
      @Column(name="first_name")
      private String firstName;
  
      @Column(name="last_name")
      private String lastName;
  
      @Column(name="email")
      private String email;
  
      @OneToOne(cascade=CascadeType.ALL)
      @JoinColumn(name="user_travel_plans")
      private UserTravelPlans userTravelPlans;
  
      public User() {
      }
  
      public User(int id, String firstName, String lastName, String email) {
          this.id = id;
          this.firstName = firstName;
          this.lastName = lastName;
          this.email = email;
      }
      public int getId() {
          return id;
      }
  
      public void setId(int id) {
          this.id = id;
      }
  
      public String getFirstName() {
          return firstName;
      }
  
      public void setFirstName(String firstName) {
          this.firstName = firstName;
      }
  
      public String getLastName() {
          return lastName;
      }
  
      public void setLastName(String lastName) {
          this.lastName = lastName;
      }
  
      public String getEmail() {
          return email;
      }
  
      public void setEmail(String email) {
          this.email = email;
      }
  
      public UserTravelPlans getUserTravelPlans() {
          return userTravelPlans;
      }
  
      public void setUserTravelPlans(UserTravelPlans userTravelPlans) {
          this.userTravelPlans = userTravelPlans;
      }
  
      @Override
      public String toString() {
          return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
      }
  
  }
  </code></pre>
  
  <p>UserTarvelPlan.java:</p>
  
  <pre><code>package com.travelplanner.rest.entity;
  
  import javax.persistence.CascadeType;
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.OneToOne;
  import javax.persistence.Table;
  
  @Entity
  @Table(name="user_travel_plans")
  public class UserTravelPlans {
  
      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      @Column(name="id")
      private int id;
  
      @Column(name="place")
      private String place;
  
      @Column(name="hotel")
      private String hotel;
  
      @Column(name="transport")
      private String transport;
  
      @OneToOne(mappedBy="userTravelPlans", cascade= {CascadeType.DETACH, CascadeType.MERGE,
              CascadeType.PERSIST, CascadeType.REFRESH})
      private User user;
  
      public UserTravelPlans() {}
  
      public UserTravelPlans(int id, String place, String hotel, String transport) {
          this.id = id;
          this.place = place;
          this.hotel = hotel;
          this.transport = transport;
      }
  
      public int getId() {
          return id;
      }
  
      public void setId(int id) {
          this.id = id;
      }
  
      public String getPlace() {
          return place;
      }
  
      public void setPlace(String place) {
          this.place = place;
      }
  
      public String getHotel() {
          return hotel;
      }
  
      public void setHotel(String hotel) {
          this.hotel = hotel;
      }
  
      public String getTransport() {
          return transport;
      }
  
      public void setTransport(String transport) {
          this.transport = transport;
      }
  
      public User getUser() {
          return user;
      }
  
      public void setUser(User user) {
          this.user = user;
      }
  
      @Override
      public String toString() {
          return "UserTravelPlans [id=" + id + ", place=" + place + ", hotel=" + hotel + ", transport=" + transport + "]";
      }
  
  }
  </code></pre>