org.hibernate.AnnotationException: @OneToOne or @ManyToOne on <entity> references an unknown entity
Asked Answered
H

9

8

I am receiving the following Hibernate Exception:

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on cz.rohan.dusps.model.Switchport.konfiguracniTemplateAccess references an unknown entity: cz.rohan.dusps.model.KonfiguracniTemplate
    org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103)
    org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541)
    org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523)
    org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380)
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377)
    org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    cz.rohan.dusps.helper.SessionFactoryHelper.initFactory(SessionFactoryHelper.java:122)
    cz.rohan.dusps.helper.SessionFactoryHelper.getSessionFactory(SessionFactoryHelper.java:134)
    cz.rohan.dusps.filter.HistorieZmenFilter.doFilter(HistorieZmenFilter.java:102)
    cz.rohan.dusps.filter.CharsetFilter.doFilter(CharsetFilter.java:41)

after ~20 hours spent on the problem with various people, having read every possible blog or forum, I am really getting desperate here.

This is a mid-sized project. I should mention the database is Postgres 9.1 and we generate the DB using a modelling tool. Hibernate connects to the database but does not generate it.

I have created a new entity in the database, it's called "KonfiguracniTemplate" (configuration template). I have created the model, controller, form, validators, .jsp's, all basically copied 1:1 from an existing entity of a similar nature. I can now work with KonfiguracniTemplate, CRUD is fully working.

The problem comes when I reference this KonfiguracniTemplate from the entity called Switchport. In the DB there is a relation between the two:

  • Switchport 1:1 ... 0:N KonfiguracniTemplate (switchport always references a KonfiguracniTemplate; a KonfiguracniTemplate MAY BE referenced zero or more times)
  • Switchport has FK konfiguracniTemplateAccess_id for this relation.

In .../model/Switchport.java the relation is mapped just like all other relations that are working:

@ManyToOne
@JoinColumn(nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

I have tried various forms:

@ManyToOne
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

or

@ManyToOne(targetEntity=KonfiguracniTemplate.class)
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

I have also checked:

  • both entities are in the same package
  • they are both annotated "@Entity" using "import javax.persistence.Entity;"
  • the build produces no error/warning messages
  • as long as the reference in Switchport is commented out, everything is fine

No matter what I try I cannot get rid of the "references an unknown entity" exception. Can somebody please share an idea what is happening or maybe how to debug the issue? The stacktrace at the top of the post is all I get in the logs.

All input is greatly appreciated!

Hybrid answered 8/9, 2011 at 14:38 Comment(5)
does this happen after a build or in development? Do your unit tests run?Prolepsis
This is a runtime exception. The build is successful, after that I can access the login form, submit and I get the exception. We don't do unit tests.Hybrid
did you check your jar and make sure that the class file for the missing class is present in the jar after the build?Prolepsis
We always commit to SVN from NetBeans and use Hudson to build the project and deploy to Tomcat. The project ends up in a single .war file. BTW I can use the KonfiguracniTemplate entity just fine. However I cannot reference it from the Switchport entity.Hybrid
Is KonfiguracniTemplate referenced in your hibernate.config.xml/ persistence.xml?Bram
L
10

Just add the class Team to the "hibernate-cfg.xml" file, because Hibernate doesn't identify without adding into it.

Lineament answered 3/9, 2013 at 6:49 Comment(1)
In my case in my HibernateConfig.javaFlock
S
2

Possible Solutions:

1) Ensure that the entity has been appropriately referenced in hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
    ... 
    <mapping class="com.project.entitytwo.model.EntityTwo"/>
    ...
</session-factory>

2) Ensure that @Entity has been specified at the class-level ( at the top of the class )

@Entity
@Table( name="ENTITY_TWO" )
public class EntityTwo extends AnyClass
{
    ...
Senior answered 27/6, 2014 at 13:32 Comment(0)
N
2

I just had this problem, with entity a referencing entity b. Both entities were located in a common JAR outside of the web project I was working on; a was declared in persistence.xml but b wasn't. I put b in a <class> tag in persistence.xml and it worked!

Nectareous answered 13/5, 2015 at 22:8 Comment(0)
S
1

I ran into this problem when using Spring and not using the hibernate.cfg.xml file. It was solved by adding the fully qualified package name of the Model class to the setPackagesToScan method of LocalSessionFactoryBean class.

Sheilahshekel answered 15/12, 2015 at 18:10 Comment(0)
H
0

Finally got the solution from another developer on the team!

The classes need to be imported before the SessionFactory object is created. Here the import for the new class was missing, so it was unknown to the SessionFactory object.

Anyway, thanks everyone for your hints!

Hybrid answered 9/9, 2011 at 9:5 Comment(1)
how exactly did you solve this problem? Which file did you edit? Can you put up in more detail about what exactly you did.Stud
M
0

There is one more chance of getting such exception; when you don't mention your mapping class in hibernate.cfg.xml file. As mentioned above.

Marceau answered 9/12, 2013 at 14:57 Comment(0)
R
0

I had same exception... I just forget add annotation (@Entity, and @Table) on MASTER class(class with Primary key)

so solution is double check every annotation in your entities , I mean not only @ManyToOne and @OneToMany like i did.

Reprobate answered 6/12, 2014 at 21:51 Comment(0)
H
0

if your two entity in diffrent project,you can scan KonfiguracniTemplate's package in other project.you can do like this in spring boot

@EntityScan({"com.thispackage.entity","com.KonfiguracniTemplatepackage.entity"})

Homeopathic answered 12/5, 2018 at 16:35 Comment(0)
H
0

I'll give you a solution that should work for the same error with Spring Boot. This has less to do with the original question, but today, people would probably look for this answer instead because noone uses XML configuration today anymore.

I suffered the same problem and found the solution on this website: https://www.programmersought.com/article/1617314625/

He even describes this very question he would have looked up, but then I'm asking myself: why didn't he answered here after finding the solution? LOL

His own words:

In the Spring Boot project, the default scan package is the package where the main method is located, that is, only the entity classes in the same package as the main method will be discovered. This way you can understand why User is not found: because User is an entity class in another module. Spring Boot does not scan other packages at all; Configure the @SpringBootApplication annotation on the main method that launches the application, telling Spring Boot that those packages need to be scanned: @SpringBootApplication(scanBasePackages = {“com.xiaomo.*”}) Then, User can be found.

So you basically reconfigure SpringBoot to scan more packages to include the other ones.

My personal addition: you could also move your packages into the package where the starter is located or move the starter a package up (that's what I did).

Hamforrd answered 28/3, 2021 at 7:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.