If you have used Hibernate with JPA and using annotation to declare your entity bean then you might have seen this confusing error called "org.hibernate.MappingException: Unknown entity". This error message is so misleading that you could easily lose anywhere between a few minutes to a few hours looking at the wrong places. I was using Spring 3 and Hibernate 3.6 when I got this error, which occurs when addEntity() method was executed. I checked everything, from Spring configuration file applicationContext.xml, Hibernate config file, my Entity class, and DAO class to see whether my Entity class is annotated or not, but I was still getting this error message.
After some googling, I eventually find that it was an incorrect import that was causing this error.
Both hibernate and JPA has @Entity annotation and somehow Eclipse was automatically importing org.hibernate.annotations.Entity instead of javax.persistence.Entity annotation. Once I fixed this import issue, everything went smoothly.
Unfortunately, this error is not easy to spot, the org.hibernate.annotations.Entity import seemed completely appropriate to many programmers.
After some googling, I eventually find that it was an incorrect import that was causing this error.
Both hibernate and JPA has @Entity annotation and somehow Eclipse was automatically importing org.hibernate.annotations.Entity instead of javax.persistence.Entity annotation. Once I fixed this import issue, everything went smoothly.
Unfortunately, this error is not easy to spot, the org.hibernate.annotations.Entity import seemed completely appropriate to many programmers.
For a newbie Java or hibernate developer it’s really hard to understand which Entity annotation to use, shouldn't be in org.hibernate.annotations.Entity, but instead it's javax.persistence.Entity.
By the way, if you are using the auto-complete functionality of Eclipse IDE, then you can blame it on them, alternatively, you can configure your preferred import in Eclipse.
Version: Spring 3 and Hibernate 3.6
Cause: Incorrect import for @Entity annotation, My entity class was incorrectly annotated by org.hibernate.annotations.Entity annotation rather than javax.persistence.Entity, which comes with JPA.
Solution : Use javax.persistence.Entity to annotate your entity beans. Don't import org.hibernate.annotations.Entity If you are new to JPA, you can further see these Hibernate and JPA online courses to learn more about Java Persistence API.
That's all about how to fix "Exception in thread “main” org.hibernate.MappingException: Unknown entity: Person" error in Hibernate, JPA and Spring-based web application. Though it's one of the simplest fixes you have to make, this can take anywhere between few minutes to few hours to actually find that this is due to the wrong package or incorrect import of @Entity annotation. Another fact, which contributes to this error is similar/same names used by JPA and hibernate. The org.hibernate.annotations existed before JPA 1.
JPA now exists and for new projects, you probably want to use it's annotations, though annoyingly they are often subtly different. It could have been better had the JPA folks could have used new names and they did in some cases, but the hibernate annotations, 4 years old before JPA1 came out were logical names.
By the way, if you are using the auto-complete functionality of Eclipse IDE, then you can blame it on them, alternatively, you can configure your preferred import in Eclipse.
Error :
Exception in thread “main” org.hibernate.MappingException: Unknown entity: Person at org.hibernate.impl.SessionFactoryImpl.getEntityPersister (SessionFactoryImpl.java:580) at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1365) at org.hibernate.event.def.AbstractSaveEventListener .saveWithGeneratedId(AbstractSaveEventListener.java:121) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener .saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveEventListener .saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener .entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveEventListener .performSaveOrUpdate(DefaultSaveEventListener.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener .onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:550)
Version: Spring 3 and Hibernate 3.6
Cause: Incorrect import for @Entity annotation, My entity class was incorrectly annotated by org.hibernate.annotations.Entity annotation rather than javax.persistence.Entity, which comes with JPA.
Solution : Use javax.persistence.Entity to annotate your entity beans. Don't import org.hibernate.annotations.Entity If you are new to JPA, you can further see these Hibernate and JPA online courses to learn more about Java Persistence API.
That's all about how to fix "Exception in thread “main” org.hibernate.MappingException: Unknown entity: Person" error in Hibernate, JPA and Spring-based web application. Though it's one of the simplest fixes you have to make, this can take anywhere between few minutes to few hours to actually find that this is due to the wrong package or incorrect import of @Entity annotation. Another fact, which contributes to this error is similar/same names used by JPA and hibernate. The org.hibernate.annotations existed before JPA 1.
JPA now exists and for new projects, you probably want to use it's annotations, though annoyingly they are often subtly different. It could have been better had the JPA folks could have used new names and they did in some cases, but the hibernate annotations, 4 years old before JPA1 came out were logical names.
Other Hibernate Articles and Interview Questions you may like
- Difference between First and Second level cache in Hibernate? (answer)
- Difference between get() and load() method in Hibernate? (answer)
- 5 Spring and Hibernate Training Courses for Java developers (list)
- 2 Books to Learn Hibernate for Beginners (books)
- 5 Books to Learn Spring Framework for Java developers(books)
- Why Hibernate Entity class should not be final in Java? (answer)
- 10 Hibernate Questions from Java Interviews (list)
- My Favorite Hibernate and JPA courses for Beginners (online courses)
Hey. I have the same problem using Play framework 2 with submodules. As long my source was in main project it was ok. After moving code to /modules/common/app/models I have this error. I cant find out solution. Can You see here
ReplyDeletehttp://stackoverflow.com/questions/25863415/how-to-persist-models-entity-in-playframework-submodule-using-jpa-hibernate/25863762#25863762
@Anonymous, It looks more like a Classpath problem than anything else. When you move your code to /modules/common/app/models, did you also updated the package statement on your entity class? Just a guess, but worth checking ...
ReplyDeleteJust a note , in a standalone Hibernate (without using Spring) , this error occurs if you missed the Entity class entry in the hibernate.cfg.xml file like:-
ReplyDeleteOnce you place entry as above for all your Entity classes, the error will be resolved.
I am using javax.persistence but I am still facing this error. Annoted the class and everything... What else can i look into ?
ReplyDeleteverify your sessionFactory property annotatedClass/packageToScan
ReplyDeleteThank you very much, iy0o!
ReplyDeleteI did typo in sessionFactory.setPackagesToScan(new String[] {"..."});
it worked for me..many thanks :)
ReplyDeleteYou saved me a week. Thank YOU
ReplyDeleteException in thread "main" org.hibernate.MappingException: An AnnotationConfiguration instance is required to use
ReplyDeleteSimple solution : If you work with Spring Framework then just change in your Dao & Service layer method's parameters type. simply replace your 'Integer' parameter to 'Object' parameter. Eg : public void delete(int id) To replace public void delete(User user). your 'Unknown entity: java.lang.Integer' error will solve...
ReplyDeleteHi Paul am getting the following error too Caused by: java.sql.SQLException: ORA-01460: unimplemented or unreasonable conversion requested along with stated above "Unknown Entity " Exception it will be helpful if you provide us with insight of relation between these exceptions.
ReplyDeleteI have this problem but adding an @Entity annotation is not an viable option. My POJO object does not have an id. Query results are just aggregated statistivcs and id is irrelevant here.
ReplyDelete